2g: Unsigned Powers

++pow

Computes a raised to the power of b, producing an atom.

Accepts

a is an atom.

b is an atom.

Produces

An atom.

Source

++ pow
~/ %pow
|= [a=@ b=@]
?: =(b 0) 1
|- ?: =(b 1) a
=+ c=$(b (div b 2))
=+ d=(mul c c)
?~ (dis b 1) d (mul d a)

Examples

> (pow 2 6)
64
> (pow 6 2)
36
> (pow 7 (add 2 2))
2.401
> (pow 2 0)
1
> `@ux`(pow 0x1b 2)
0x2d9

++sqt

Computes the square root of a and its remainder.

Accepts

a is an atom.

Produces

A cell of atoms.

Source

++ sqt
~/ %sqt
|= a=@ ^- [p=@ q=@]
?~ a [0 0]
=+ [q=(div (dec (xeb a)) 2) r=0]
=- [-.b (sub a +.b)]
^= b |-
=+ s=(add r (bex q))
=+ t=(mul s s)
?: =(q 0)
?:((lte t a) [s t] [r (mul r r)])
?: (lte t a)
$(r s, q (dec q))
$(q (dec q))

Examples

> (sqt 4)
[p=2 q=0]
> (sqt 6)
[p=2 q=2]
> (sqt 2)
[p=1 q=1]
> (sqt 0b1101)
[p=3 q=4]
> `@ux`(sqt 0b1101)
! exit