コード例 #1
0
        public static BigNum operator/(BigNum A, BigNum B)
        {
            BigNum L1 = new BigNum(1),
                   t1 = new BigNum(A),
                   t2 = new BigNum(B),
                   t  = new BigNum();
            bool an   = A.Is_Negative(),
                 bn   = B.Is_Negative();

            if (an)
            {
                t1.Neg();
            }
            if (bn)
            {
                t2.Neg();
            }
            int l1 = t1.Last_Bit_Pos(), l2 = t2.Last_Bit_Pos();

            while (l1 > l2)
            {
                int p = l1 - l2 - 1;
                for (int i = 0; i < p; i++)
                {
                    t2.Shift_Left_Once();
                    L1.Shift_Left_Once();
                }
                t  = t + L1;
                t1 = t1 - t2;
                for (int i = 0; i < p; i++)
                {
                    t2.Shift_Right_Once();
                    L1.Shift_Right_Once();
                }
                l1 = t1.Last_Bit_Pos();
                l2 = t2.Last_Bit_Pos();
            }
            t1 = t1 - t2;
            if (!t1.Is_Negative())
            {
                t = t + L1;
            }
            if (an)
            {
                t.Neg();
            }
            if (bn)
            {
                t.Neg();
            }
            return(t);
        }
コード例 #2
0
        public static BigNum operator*(BigNum A, BigNum B)
        {
            BigNum t  = new BigNum();
            BigNum t1 = new BigNum(A),
                   t2 = new BigNum(B);
            bool an   = A.Is_Negative(),
                 bn   = B.Is_Negative();

            if (an)
            {
                t1.Neg();
            }
            if (bn)
            {
                t2.Neg();
            }

            while (t2.Greater_Than_Zero())
            {
                if ((t2.BigNum_ary[0] & 1) == 1)
                {
                    t = t + t1;
                }
                t2.Shift_Right_Once();
                t1.Shift_Left_Once();
            }
            if (an)
            {
                t.Neg();
            }
            if (bn)
            {
                t.Neg();
            }
            return(t);
        }