Lidgren.Network.NetBigInteger.ExtEuclid C# (CSharp) Метод

ExtEuclid() приватный статический Метод

private static ExtEuclid ( NetBigInteger a, NetBigInteger b, NetBigInteger u1Out, NetBigInteger u2Out ) : NetBigInteger
a NetBigInteger
b NetBigInteger
u1Out NetBigInteger
u2Out NetBigInteger
Результат NetBigInteger
        private static NetBigInteger ExtEuclid(
			NetBigInteger a,
			NetBigInteger b,
			NetBigInteger u1Out,
			NetBigInteger u2Out)
        {
            NetBigInteger u1 = One;
            NetBigInteger u3 = a;
            NetBigInteger v1 = Zero;
            NetBigInteger v3 = b;

            while (v3.m_sign > 0)
            {
                NetBigInteger[] q = u3.DivideAndRemainder(v3);

                NetBigInteger tmp = v1.Multiply(q[0]);
                NetBigInteger tn = u1.Subtract(tmp);
                u1 = v1;
                v1 = tn;

                u3 = v3;
                v3 = q[1];
            }

            if (u1Out != null)
            {
                u1Out.m_sign = u1.m_sign;
                u1Out.m_magnitude = u1.m_magnitude;
            }

            if (u2Out != null)
            {
                NetBigInteger tmp = u1.Multiply(a);
                tmp = u3.Subtract(tmp);
                NetBigInteger res = tmp.Divide(b);
                u2Out.m_sign = res.m_sign;
                u2Out.m_magnitude = res.m_magnitude;
            }

            return u3;
        }