public static BigNum operator-(BigNum A, BigNum B) { BigNum T = new BigNum(B); for (int i = 0; i < 64; i++) { T.BigNum_ary[i] = ~T.BigNum_ary[i]; } T.Add_One(); return(A + T); }
public BigNum(BigNum A) { this.BigNum_ary = new ulong[64]; Array.Clear(this.BigNum_ary, 0, this.BigNum_ary.Length); for (int i = 0; i < 64; i++) { this.BigNum_ary[i] = A.BigNum_ary[i]; } this.MaxVal = "(2^4095)-1"; this.MinVal = "(-2^4095)+1"; }
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 void Binary_Dump() { BigNum T = new BigNum(this); while (T.Greater_Than_Zero()) { if ((T.BigNum_ary[0] & 1) == 1) { Console.Write("1"); } else { Console.Write("0"); } T.Shift_Right_Once(); } Console.WriteLine(); }
static void Main(string[] args) { BigNum a = new BigNum(-1); BigNum b = new BigNum(10); BigNum c = new BigNum(); BigNum d = new BigNum(1000000000); d = d * d; d = d * d; d.Print(); d = d * d; d.Print(); d *= d; d.Print(); //d.Binary_Dump(); //Console.WriteLine(d.Last_Bit_Pos()); c = a * b; c.Print(); c = a * a; c.Print(); c = a - b; c.Print(); c = b - a; c.Print(); c = a + b; c.Print(); c = b / a; c.Print(); c = d / b; c.Print(); Console.WriteLine("Max Big_Num_val:{0}=", a.MaxVal); c.Set_MaxVal(); c.Print(); Console.WriteLine("Min Big_Num val:{0}", a.MinVal); c.Set_MinVal(); c.Print(); c = c / a; c.Print(); c = c * a; c.Print(); }
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); }
public void Print() { bool neg = false; BigNum T = new BigNum(this); if (T.Is_Negative()) { neg = true; } if (neg) { T.Neg(); } List <int> t1 = new List <int>(), t2 = new List <int>(); t1.Add(1); int carry = 0; while (T.Greater_Than_Zero()) { if ((T.BigNum_ary[0] & 1) == 1) { for (int i = 0; i < t2.Count; i++) { t2[i] += t1[i]; } for (int i = t2.Count; i < t1.Count; i++) { t2.Add(t1[i]); } for (int i = 0; i < t2.Count; i++) { t2[i] += carry; carry = 0; carry = (t2[i] - (t2[i] % 10)) / 10; t2[i] %= 10; } while (carry > 0) { t2.Add(carry % 10); carry /= 10; } } for (int i = 0; i < t1.Count; i++) { t1[i] *= 2; t1[i] += carry; carry = 0; carry = (t1[i] - (t1[i] % 10)) / 10; t1[i] %= 10; } while (carry > 0) { t1.Add(carry % 10); carry /= 10; } T.Shift_Right_Once(); } t2.Reverse(); if (neg) { Console.Write("-"); } t2.ForEach(i => Console.Write("{0}", i)); Console.WriteLine(); }