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