package main import ( "container/list" "log" ) type ( // Set is ordered set of alphabet Set struct{ *list.List } // Element of ordered set Element struct{ *list.Element } ) var ( alphabet Set zero, one Element ) func init() { alphabet = Set{list.New()} for i := 0; i <= maxValue; i++ { alphabet.PushBack(i) } zero = Element{alphabet.Front()} one = Element{zero.Next()} } func (m Element) next() Element { if nxt := m.Next(); nxt != nil { return Element{nxt} } log.Fatal("out of range ", m) return Element{} } func (m Element) prev() Element { if prv := m.Prev(); prv != nil { return Element{prv} } return zero } // Add defines addition func Add(m, n Element) Element { return m.add(n) } func (m Element) add(n Element) Element { if m == zero { return n } return m.prev().add(n).next() } // Mul defines mutiplication func Mul(m, n Element) Element { return m.mul(n) } func (m Element) mul(n Element) Element { if m == zero { return zero } return m.prev().mul(n).add(n) } // Pot defines power function func Pot(m, n Element) Element { return m.pot(n) } func (m Element) pot(n Element) Element { if n == zero { return one } return m.pot(n.prev()).mul(m) } // Sub defines substraction func Sub(m, n Element) Element { return m.sub(n) } func (m Element) sub(n Element) Element { if n == zero { return m } return m.sub(n.prev()).prev() }