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); }
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); }