~/bend-docscommunity

proofs/math/number/egcd.bend checks

raw source on the hub · import bend-collections-laws-math@1.0.0.0/proofs/math/number/egcd.bend as Egcd

6 imports
import Base
import ../../lib/lemmas/proofs/nat_algebra.bend as A
import ../../../src/math/natural.bend as M
import ../../../src/math/number.bend as NB
import ../../../spec/math/number.bend as SN
import ../natural/arith.bend as R

Definitions

def up_gcd source · line 16 · raw

@+q:Nat -> @r:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.EGcd -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_gcd(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.eg_up(q, r)) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_gcd(r) : Nat}

def gcd_go source · line 21 · raw

@+f:Nat -> @+a:Nat -> @+b:Nat -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_gcd(0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.egcd_go(f, a, b)) == 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/natural.gcd_go(f, a, b) : Nat}

def egcd_gcd source · line 31 · raw

@+a:Nat -> @+b:Nat -> 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.Egcd.gcd(a, b)

def qby source · line 37 · raw

@+q:Nat -> @+b:Nat -> @+y:Nat -> {Nat.mul(Nat.mul(q, b), y) == Nat.mul(b, Nat.mul(q, y)) : Nat}

(q b) y == b (q y)

def spread source · line 42 · raw

@+q:Nat -> @+b:Nat -> @+r:Nat -> @+y:Nat -> {Nat.mul(Nat.add(Nat.mul(q, b), r), y) == Nat.add(Nat.mul(b, Nat.mul(q, y)), Nat.mul(r, y)) : Nat}

(q b + r) y == b (q y) + r y

def alg_pos source · line 48 · raw

@+g:Nat -> @+x:Nat -> @+y:Nat -> @+q:Nat -> @+b:Nat -> @+r:Nat -> @+ih:{Nat.mul(b, x) == Nat.add(g, Nat.mul(r, y)) : Nat} -> {Nat.mul(b, Nat.add(x, Nat.mul(q, y))) == Nat.add(g, Nat.mul(Nat.add(Nat.mul(q, b), r), y)) : Nat}

child b x == g + r y gives b (x + q y) == g + (q b + r) y

def alg_neg source · line 56 · raw

@+g:Nat -> @+x:Nat -> @+y:Nat -> @+q:Nat -> @+b:Nat -> @+r:Nat -> @+ih:{Nat.mul(r, y) == Nat.add(g, Nat.mul(b, x)) : Nat} -> {Nat.mul(Nat.add(Nat.mul(q, b), r), y) == Nat.add(g, Nat.mul(b, Nat.add(x, Nat.mul(q, y)))) : Nat}

child r y == g + b x gives (q b + r) y == g + b (x + q y)

def base source · line 65 · raw

@+a:Nat -> @+b:Nat -> {Nat.mul(a, 1n) == Nat.add(a, Nat.mul(b, 0n)) : Nat}

the base case: a * 1 == a + b * 0

def up_sign source · line 70 · raw

@+a:Nat -> @+b:Nat -> @+q:Nat -> @+r:Nat -> @+ha:{a == Nat.add(Nat.mul(q, b), r) : Nat} -> @+g:Nat -> @+x:Nat -> @+y:Nat -> @+neg:Bool -> @+ih:{0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_pos(b, r, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.EG{g, x, y, neg}) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_neg(b, r, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.EG{g, x, y, neg}) : Nat} -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_pos(a, b, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.eg_up(q, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.EG{g, x, y, neg})) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_neg(a, b, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.eg_up(q, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.EG{g, x, y, neg})) : Nat}

def up_bez source · line 81 · raw

@+a:Nat -> @+b:Nat -> @+q:Nat -> @+r:Nat -> @+ha:{a == Nat.add(Nat.mul(q, b), r) : Nat} -> @c:0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.EGcd -> @+ih:{0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_pos(b, r, c) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_neg(b, r, c) : Nat} -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_pos(a, b, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.eg_up(q, c)) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_neg(a, b, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.eg_up(q, c)) : Nat}

one level up: from the child's identity for (b, r) to the parent's for (a, b), a == q b + r

def split source · line 87 · raw

@+a:Nat -> @+bp:Nat -> {a == Nat.add(Nat.mul(Nat.div(a, 1n+bp), 1n+bp), Nat.mod(a, 1n+bp)) : Nat}

a == (a div b) b + a mod b

def bez_go source · line 90 · raw

@+f:Nat -> @+a:Nat -> @+b:Nat -> {0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_pos(a, b, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.egcd_go(f, a, b)) == 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.eg_neg(a, b, 0xf86f5f1d9a594d5a5cff999100e01d03/src/math/number.egcd_go(f, a, b)) : Nat}

def egcd_bezout source · line 99 · raw

@+a:Nat -> @+b:Nat -> 0xf86f5f1d9a594d5a5cff999100e01d03/spec/math/number.Egcd.bezout(a, b)