package main import ( "container/list" "log" ) var ( alphabet *list.List zero, one *list.Element ) func init() { alphabet = list.New() for i := 0; i <= 1000; i++ { alphabet.PushBack(i) } zero = alphabet.Front() one = zero.Next() } // next returns next char in alphabet func next(n *list.Element) *list.Element { if nxt := n.Next(); nxt != nil { return nxt } log.Fatal("out of range", n.Value) return nil } // prev returns previous char in alphabet func prev(n *list.Element) *list.Element { if prv := n.Prev(); prv != nil { return prv } return zero } // add defines addition func add(m, n *list.Element) *list.Element { if m == zero { return n } return next(add(prev(m), n)) } // times defines mutiplication func times(m, n *list.Element) *list.Element { if m == zero { return zero } return add(times(prev(m), n), n) } // pot defines power function func pot(m, n *list.Element) *list.Element { if n == zero { return one } return times(pot(m, prev(n)), m) } // sub defines substraction func sub(m, n *list.Element) *list.Element { if n == zero { return m } return prev(sub(m, prev(n))) } // scan lookups element representation func scan(n int) *list.Element { if n > alphabet.Len() { log.Fatal("out of range") return nil } e := alphabet.Front() for i := 0; i < n; i++ { e = e.Next() } return e }