aboutsummaryrefslogtreecommitdiff
path: root/ops.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-04-08 00:34:47 +0200
committerDimitri Sokolyuk <demon@dim13.org>2015-04-08 00:34:47 +0200
commit9bd34c97d05499a9dc5922481470de04efa147aa (patch)
tree0fc272a07ff983655b716094b539190a6686d3b2 /ops.go
parent37bebb461450fa8eb8ace1015c9eccdb7a4f7844 (diff)
Split files
Diffstat (limited to 'ops.go')
-rw-r--r--ops.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/ops.go b/ops.go
new file mode 100644
index 0000000..5fd61cc
--- /dev/null
+++ b/ops.go
@@ -0,0 +1,82 @@
+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
+}