예제 #1
0
        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);
        }
예제 #2
0
 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";
 }
예제 #3
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);
        }
예제 #4
0
        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();
        }
예제 #5
0
파일: Program.cs 프로젝트: mtdudek/PO
        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();
        }
예제 #6
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);
        }
예제 #7
0
        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();
        }