3a: Modular and Signed Ints

+egcd

Extended Euclidean algorithm.

Produces .d, the greatest common divisor of .a and .b. Also produces .u and .v such that au+bv=GCD(a,b)au + bv = GCD(a, b).

Accepts

.a is an $atom.

.b is an $atom.

Produces

.d, the greatest common divisor, is an $atom.

.u, the coefficient of .a, is a signed integer.

.v, the coefficient of .b, is a signed integer.

Source

++  egcd
  |=  [a=@ b=@]
  =+  si
  =+  [c=(sun a) d=(sun b)]
  =+  [u=[c=(sun 1) d=--0] v=[c=--0 d=(sun 1)]]
  |-  ^-  [d=@ u=@s v=@s]
  ?:  =(--0 c)
    [(abs d) d.u d.v]
  =+  q=(fra d c)
  %=  $
    c  (dif d (pro q c))
    d  c
    u  [(dif d.u (pro q c.u)) c.u]
    v  [(dif d.v (pro q c.v)) c.v]
  ==

Examples


+fo

Modulo prime.

Container door for modular arithmetic functions.

Accepts

.a is an $atom

Source


+dif:fo

Subtraction.

Produces the difference between $atoms .b and .c, with .a as the modular base.

Accepts

.a is an $atom, and is the sample of +fo.

.b is an $atom.

.c is an $atom.

Produces

An $atom.

Source

Examples


+exp:fo

Exponent.

Produces the power of .c raised to the .b, with .a as the modular base.

Accepts

.a is an $atom, and is the sample of +fo.

.b is an $atom.

.c is an $atom.

Produces

An $atom.

Source

Examples


+fra:fo

Divide.

Produces the quotient of .b divided by .c, with .a as the modular base.

Accepts

.a is an $atom, and is the sample of +fo.

.b is an $atom.

.c is an $atom.

Produces

An $atom.

Source

Examples


+inv:fo

Inverse.

Produces an $atom by taking the signed modulus of .a with the coefficient .u; .u is produced by taking the +egcd of .a and .b.

Accepts

.a is an $atom, and is the sample of +fo.

.b is an $atom.

Produces

An $atom.

Source

Examples


+pro:fo

Multiplication.

Produces the multiplication of .b and .c modulo .a.

Accepts

.a is an $atom, and is the sample of +fo.

.b is an $atom.

.c is an $atom.

Produces

An $atom.

Source

Examples


+sit:fo

Modulus.

Produces the remainder of .b modulo .a.

Accepts

.a is an $atom, and is the sample of +fo.

.b is an $atom.

Produces

An $atom.

Source

Examples


+sum:fo

Modular sum.

Produces the remainder of (b + c) mod a.

Accepts

.a is an $atom, and is the sample of +fo.

.b is an $atom.

.c is an $atom.

Produces

An $atom.

Source

Examples


+si

Signed integer.

Container core for signed integer functions.

Source

Discussion

The signed-integer type is represented by the @s aura. Positive integers are prepended with a --, and negative integers are prepended with a -. For example, --1 represents positive one, and -1 represents negative one.

ZigZag encoding is used to convert $atoms to signed integers. Positive signed integers correspond to even $atoms of twice their absolute value, and negative signed integers correspond to odd $atoms of twice their absolute value minus one. For example:


+abs:si

Absolute value.

Produces the absolute value of signed integer .a.

Accepts

.a is a signed integer.

Produces

An $atom.

Source

Examples


+dif:si

Subtraction.

Produces the difference of .a minus .b.

Accepts

.a is a signed integer.

.b is a signed integer.

Produces

A signed integer.

Source

Examples


+dul:si

Modulus.

Produces the remainder of .b modulo .a.

Examples

.a is a signed integer.

.b is an $atom.

Produces

An $atom.

Source

Examples


+fra:si

Divide.

Produces the quotient of .b divided by .c.

Accepts

.a is a signed integer.

.b is a signed integer.

Produces

A signed $atom.

Source

Examples


+new:si

Atom to @s.

Produces a signed integer from an $atom .b. The product's sign is determined by the value of flag .a: & will result in a prepending --, and | will result in a prepending -.

Accepts

.a is a $flag.

.b is an $atom.

Produces

A signed integer.

Source

Examples


+old:si

Sign and absolute value.

Produces a cell composed of a %.y or %.n, depending on whether .a is positive or negative, and the absolute value of .a.

Accepts

.a is a signed integer.

Produces

A cell composed of a $flag and an $atom.

Source

Examples


+pro:si

Multiplication.

Produces a signed integer by multiplying .a and .b.

Accepts

.a is an unsigned integer.

.b is an unsigned integer.

Source

Examples


+rem:si

Remainder.

Produces a signed integer that is the remainder of .a divided by .b.

Accepts

.a is a signed integer.

.b is a signed integer.

Produces

A signed integer.

Source

Examples


+sum:si

Addition.

Produces an $atom by adding .a and .b.

Accepts

.a is a signed integer.

.b is a signed integer.

Produces

A signed integer.

Source

Examples


+sun:si

@u to @s.

Multiplies the unsigned integer .a by two, producing an $atom.

Accepts

.a is an unsigned integer.

Produces

An $atom.

Source

Examples


+syn:si

Sign test.

Tests whether signed $atom .a is positive or negative. %.y is produced if .a is positive, and %.n is produced if .a is negative.

Accepts

.a is a signed integer.

Produces

A $flag.

Source

Examples


+cmp:si

Compare.

Compares .a and .b to see which is greater. If .a is greater than .b, --1 is produced. If .b is greater than .a, -1 is produced. If .a and .b are equal, --0 is produced.

Accepts

.a is a signed integer.

.b is a signed integer.

Produces

A signed integer.

Source

Examples


Last updated