-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpower.echo
More file actions
90 lines (85 loc) · 1.43 KB
/
Copy pathpower.echo
File metadata and controls
90 lines (85 loc) · 1.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
; Integer power — exponentiation by squaring.
; Run: xo run examples/algos/power.echo
/ std/io
/ std/str
; base^exp for non-negative exp. 0^0 is treated as 1.
$ pow = (base, exp) {
? exp < 0 {
! "negative exponent"
}
~ b = base
~ e = exp
~ acc = 1
* e > 0 {
? e % 2 == 1 {
~ acc = acc * b
}
~ b = b * b
~ e = e / 2
}
^ acc
}
; Modular power: (base^exp) mod m (m > 0).
$ pow_mod = (base, exp, m) {
? exp < 0 {
! "negative exponent"
}
? m <= 0 {
! "modulus must be positive"
}
~ b = base % m
? b < 0 {
~ b = b + m
}
~ e = exp
~ acc = 1
* e > 0 {
? e % 2 == 1 {
~ acc = acc * b % m
}
~ b = b * b % m
~ e = e / 2
}
^ acc
}
| pow(2, 0) {
$ v {
io.print(str.from_int(v))
}
! err {
io.print(str.from_int(err))
}
}
| pow(2, 10) {
$ v {
io.print(str.from_int(v))
}
! err {
io.print(str.from_int(err))
}
}
| pow(3, 5) {
$ v {
io.print(str.from_int(v))
}
! err {
io.print(str.from_int(err))
}
}
| pow_mod(2, 10, 1000) {
$ v {
io.print(str.from_int(v))
}
! err {
io.print(str.from_int(err))
}
}
| pow_mod(7, 3, 5) {
$ v {
io.print(str.from_int(v))
}
! err {
io.print(str.from_int(err))
}
}
\ pow, pow_mod