コード例 #1
0
            public BigInt ModInv(BigInt p, BigInt negP)
            {
                var u  = this.Clone();
                var v  = p.Clone();
                var x1 = new BigInt(1, p.Length);
                var x2 = new BigInt(0, p.Length);

                while (!u.IsOne() && !v.IsOne())
                {
                    while (u.IsEven())
                    {
                        u.Div2Trunc();
                        x1.Div2(p);
                    }
                    while (v.IsEven())
                    {
                        v.Div2Trunc();
                        x2.Div2(p);
                    }
                    if (u >= v)
                    {
                        var uTmp = u;
                        u = u.SubMod(v, p, negP);
                        uTmp.Clear();
                        var x1Tmp = x1;
                        x1 = x1.SubMod(x2, p, negP);
                        x1Tmp.Clear();
                    }
                    else
                    {
                        var vTmp = v;
                        v = v.SubMod(u, p, negP);
                        vTmp.Clear();
                        var x2Tmp = x2;
                        x2 = x2.SubMod(x1, p, negP);
                        x2Tmp.Clear();
                    }
                }
                v.Clear();
                if (u.IsOne())
                {
                    u.Clear();
                    x2.Clear();
                    return(x1);
                }
                else
                {
                    u.Clear();
                    x1.Clear();
                    return(x2);
                }
            }