Exemple #1
0
        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));
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        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));
        }
Exemple #4
0
        public MyBigInteger Pow(MyBigInteger pow)
        {
            var result = this.Clone();

            while (pow.value > 0)
            {
                result = result.Mult(this);
                pow.value--;
            }

            return(result);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        public virtual MyBigInteger Mode(MyBigInteger b)
        {
            var x = value % b.value;

            return(new MyBigInteger(x < 0 ? x + b.value : x, modular));
        }
Exemple #7
0
 public virtual MyBigInteger Divide(MyBigInteger b)
 {
     return(new MyBigInteger(value / b.value, modular));
 }
Exemple #8
0
 public virtual MyBigInteger Minus(MyBigInteger b)
 {
     return(new MyBigInteger(value - b.value, modular));
 }
Exemple #9
0
 public virtual MyBigInteger Mult(MyBigInteger b)
 {
     return(new MyBigInteger(value * b.value, modular));
 }
Exemple #10
0
 public virtual MyBigInteger ModPow(MyBigInteger exp, MyBigInteger m)
 {
     return(new MyBigInteger(BigInteger.ModPow(value, exp.value, m.value), modular));
 }
Exemple #11
0
        public override MyBigInteger Minus(MyBigInteger y1)
        {
            var y = (GaluaBigInteger)y1;

            return(new GaluaBigInteger(value ^ y.value, modular, n));
        }
Exemple #12
0
 public override MyBigInteger ModPow(MyBigInteger exp, MyBigInteger m)
 {
     return(this.Pow(exp));
 }