Пример #1
0
        public LongInteger Minus(LongInteger a, LongInteger b, bool reverse = true)
        {
            if (a.x == b.x)
            {
                return(new LongInteger("0"));
            }
            if (reverse)
            {
                a = a.Reverse();
                b = b.Reverse();
            }
            string c = "";
            int    z, y = 0;

            for (int i = 0; i < b.x.Length; i++)
            {
                z = int.Parse(Convert.ToString(a.x[i])) - int.Parse(Convert.ToString(b.x[i])) + y;
                if (z < 0)
                {
                    z += 10;
                    y  = -1;
                }
                else
                {
                    y = 0;
                }
                c += Convert.ToString(z);
            }
            for (int i = b.x.Length; i < a.x.Length; i++)
            {
                z = int.Parse(Convert.ToString(a.x[i])) + y;
                if (z < 0)
                {
                    z += 10;
                    y  = -1;
                }
                else
                {
                    y = 0;
                }
                c += Convert.ToString(z);
            }
            int j = 0;

            while (c[c.Length - j - 1] == '0')
            {
                j++;
            }
            c = c.Remove(c.Length - j, j);
            if (reverse)
            {
                return(new LongInteger(c).Reverse());
            }
            else
            {
                return(new LongInteger(c));
            }
        }
Пример #2
0
        static void Main(string[] args)
        {
            LongInteger k = new LongInteger(Console.ReadLine());
            LongInteger n = new LongInteger(Console.ReadLine());
            LongInteger s = new LongInteger("0");

            s = s.Minus(s.PowInteger(k, n), new LongInteger("1")); // k^(n)-1. Возведение в степень - быстрое, если что.
            k = s.Minus(k, new LongInteger("1"));                  // k-1.
            s = s.Divided(s, k);                                   // s/k.
            Console.WriteLine(s.x);
            Console.ReadLine();
        }
Пример #3
0
        public LongInteger Plus(LongInteger a, LongInteger b, bool reverse = true)
        {
            if (reverse)
            {
                a = a.Reverse();
                b = b.Reverse();
            }
            string c = "";
            int    z;
            int    y = 0;

            if (a.x.Length < b.x.Length)
            {
                c   = a.x;
                a.x = b.x;
                b.x = c;
                c   = "";
            }
            for (int i = 0; i < b.x.Length; i++)
            {
                z  = int.Parse(Convert.ToString(a.x[i])) + int.Parse(Convert.ToString(b.x[i])) + y;
                y  = z / 10;
                c += Convert.ToString(z % 10);
            }
            for (int i = b.x.Length; i < a.x.Length; i++)
            {
                z  = int.Parse(Convert.ToString(a.x[i])) + y;
                y  = z / 10;
                c += Convert.ToString(z % 10);
            }
            if (y != 0)
            {
                c += "1";
            }
            if (reverse)
            {
                return(new LongInteger(c).Reverse());
            }
            else
            {
                return(new LongInteger(c));
            }
        }
Пример #4
0
        public LongInteger ComplexMultiplied(LongInteger a, LongInteger b, bool reverse = true)
        // Обычное умножение.
        {
            if (reverse)
            {
                a = a.Reverse();
                b = b.Reverse();
            }
            string      c  = "";
            LongInteger r  = new LongInteger("0");
            LongInteger b1 = new LongInteger("0");

            if (a.x.Length < b.x.Length)
            {
                c   = a.x;
                a.x = b.x;
                b.x = c;
                c   = "";
            }
            int k = 0;

            for (int i = 0; i < b.x.Length; i++)
            {
                r = EasyMultiplied(a, int.Parse(Convert.ToString(b.x[i])));
                string s = "";
                for (int j = 0; j < k; j++)
                {
                    s += "0";
                }
                r.x = r.x.Insert(0, s);
                k++;
                b1 = Plus(b1, r, false);
            }
            if (reverse)
            {
                return(b1.Reverse());
            }
            else
            {
                return(b1);
            }
        }
Пример #5
0
        public LongInteger Karatsuba(LongInteger a, LongInteger b, bool reverse = false)
        {
            if (reverse)
            {
                a = a.Reverse();
                b = b.Reverse();
            }
            int n = a.min(a.x.Length, b.x.Length);
            int u = a.max(a.x.Length, b.x.Length);

            if (n == 1)
            {
                return(ComplexMultiplied(a, b));
            }
            string k = "";

            for (int i = 1; i <= (n / 2) * 2; i++)
            {
                k += "0";
            }
            LongInteger f1, f2, f3, f4 = new LongInteger("");
            string      x1 = a.x.Substring(0, a.x.Length - n / 2), x2 = a.Reverse().x.Substring(0, n / 2), y1 = b.x.Substring(0, b.x.Length - n / 2), y2 = b.Reverse().x.Substring(0, n / 2);

            x2 = a.ReverseStr(x2);
            y2 = a.ReverseStr(y2);
            f1 = Karatsuba(new LongInteger(x1), new LongInteger(y1));
            f2 = Karatsuba(new LongInteger(x2), new LongInteger(y2));
            f3 = Karatsuba(Plus(new LongInteger(x1), new LongInteger(x2)), Plus(new LongInteger(y1), new LongInteger(y2)));
            f1 = Plus(Plus(new LongInteger(f1.x + k), new LongInteger(Minus(f3, Plus(f1, f2)).x + k.Substring(0, n / 2))), f2);
            if (reverse)
            {
                return(f1.Reverse());
            }
            else
            {
                return(f1);
            }
        }
Пример #6
0
        public LongInteger PowInteger(LongInteger a, LongInteger k)
        {
            LongInteger    b   = new LongInteger("1");
            HashSet <char> hsh = new HashSet <char>();

            foreach (char i in "02468")
            {
                hsh.Add(i);
            }
            while (a.StringComparer(k.x, "0"))
            {
                if (hsh.Contains(k.x[k.x.Length - 1]))
                {
                    k = k.Divided(k, new LongInteger("2"));
                    a = a.ComplexMultiplied(a, a);
                }
                else
                {
                    k = k.Minus(k, new LongInteger("1"));
                    b = b.ComplexMultiplied(b, a);
                }
            }
            return(b);
        }
Пример #7
0
        private LongInteger EasyMultiplied(LongInteger a, int b)
        // Умножение а на одноразрядное число.
        {
            if (b == 0)
            {
                return(new LongInteger("0"));
            }

            string c = "";
            int    z;
            int    y = 0;

            for (int i = 0; i < a.x.Length; i++)
            {
                z  = int.Parse(Convert.ToString(a.x[i])) * b + y;
                y  = z / 10;
                c += Convert.ToString(z % 10);
            }
            if (y != 0)
            {
                c += Convert.ToString(y);
            }
            return(new LongInteger(c));
        }
Пример #8
0
        public LongInteger Divided(LongInteger a, LongInteger b, bool reverse = false)//????????)
        {
            // деление без остатка.
            if (b.x == "1")
            {
                return(a);
            }
            if (reverse)
            {
                a = a.Reverse();
                b = b.Reverse();
            }
            string c = "", n = "", r = "";
            int    z, k = 0, x = 1;
            int    y = 0, y1 = 0;

            while (a.x.Length > k)
            {
                //y1 = 0;
                n += Convert.ToString(a.x[k]);
                k++;
                while (a.StringComparer(b.x, n) && (k < a.x.Length))
                {
                    n += Convert.ToString(a.x[k]);
                    if ((y != 0))
                    {
                        c += "0";
                    }
                    k++;
                }
                x = 1;
                while (a.StringComparer(n, b.ComplexMultiplied(b, new LongInteger(Convert.ToString(x))).x, true))
                {
                    x++;
                }
                x--;
                n = Convert.ToString(a.Minus(new LongInteger(n), new LongInteger(Convert.ToString(int.Parse(b.x) * x))).x);
                z = 0;
                while ((n[z] == '0') && (k < n.Length))
                {
                    z++;
                }
                if (z != 0)
                {
                    n = n.Substring(z);
                }
                if (n[0] == '0')
                {
                    n = n.Remove(0, 1);
                }
                c += Convert.ToString(x);
                y++;
            }

            if (reverse)
            {
                return(new LongInteger(c).Reverse());
            }
            else
            {
                return(new LongInteger(c));
            }
        }