public override MyBigInteger Divide(MyBigInteger y1) { var y = (GaluaBigInteger)y1; var p = value; var q = y.value; var res = BigInteger.Zero; while (p.Degree() >= q.Degree()) { var i = BigInteger.One; while (i <= q) { i <<= 1; } i >>= 1; var k = BigInteger.One; while (i * k <= p) { k <<= 1; } k >>= 1; p = p ^ (q * k); res += k; } return(new GaluaBigInteger(res, modular, n)); }
public override MyBigInteger Mult(MyBigInteger y1) { var y = (GaluaBigInteger)y1; var p = BigInteger.Zero; var a = value; var b = y.value; while (b != 0) { if ((b & 1) != 0) { p ^= a; } if (a >= n) { a = (a << 1) ^ modular; } else { a <<= 1; } b >>= 1; } return(new GaluaBigInteger(p, modular, n)); }
public override MyBigInteger Mode(MyBigInteger y1) { var y = (GaluaBigInteger)y1; var p = value; var q = y.value; while (p.Degree() >= q.Degree()) { var i = BigInteger.One; while (i <= q) { i <<= 1; } i >>= 1; var k = 0; while (i <= p) { i <<= 1; ++k; } --k; p = p ^ (q << k); } return(new GaluaBigInteger(p, modular, n)); }
public MyBigInteger Pow(MyBigInteger pow) { var result = this.Clone(); while (pow.value > 0) { result = result.Mult(this); pow.value--; } return(result); }
private static MyBigInteger Gcd(MyBigInteger a, MyBigInteger b, ref MyBigInteger x, ref MyBigInteger y) { if (a.value == 0) { x.value = 0; y = a.One(); return(b); } var x1 = a.Zero(); var y1 = a.Zero(); var d = Gcd(b.Mode(a), a, ref x1, ref y1); x = y1.Minus(b.Divide(a).Mult(x1)); y = x1; return(d); }
public virtual MyBigInteger Mode(MyBigInteger b) { var x = value % b.value; return(new MyBigInteger(x < 0 ? x + b.value : x, modular)); }
public virtual MyBigInteger Divide(MyBigInteger b) { return(new MyBigInteger(value / b.value, modular)); }
public virtual MyBigInteger Minus(MyBigInteger b) { return(new MyBigInteger(value - b.value, modular)); }
public virtual MyBigInteger Mult(MyBigInteger b) { return(new MyBigInteger(value * b.value, modular)); }
public virtual MyBigInteger ModPow(MyBigInteger exp, MyBigInteger m) { return(new MyBigInteger(BigInteger.ModPow(value, exp.value, m.value), modular)); }
public override MyBigInteger Minus(MyBigInteger y1) { var y = (GaluaBigInteger)y1; return(new GaluaBigInteger(value ^ y.value, modular, n)); }
public override MyBigInteger ModPow(MyBigInteger exp, MyBigInteger m) { return(this.Pow(exp)); }