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