public static void Emit(Primes primes) { TestLogger.Log("3."); var i = 2; while (true) { if (i + 9 > knownDigits.Length) { TestLogger.Log("Ran out of known digits to check against"); return; } var digits = nineDigitsAt(primes, i - 1); if (digits == null) { TestLogger.Log("Ran out of primes"); return; } if (digits != knownDigits.Substring(i, 9)) { throw new InvalidOperationException("calculated digits do not agree with actual digits"); } i += 9; TestLogger.Log(digits); } }
public static void Main() { TestLogger.Log("Testing integer arithmetic..."); var a = ReadInt("1"); var b = ReadInt("2"); var c = ReadInt("3"); TestLogger.Log((a + (b * c))); TestLogger.Log((a - (b * c))); TestLogger.Log((((a + b) * (c + b)) * c)); TestLogger.Log((-c * 4)); TestLogger.Log(((c * c) / b)); TestLogger.Log(((-c * c) / b)); TestLogger.Log(((c * c) % b)); TestLogger.Log(((-c * c) % b)); TestLogger.Log(a < b); TestLogger.Log(a + b <= c); var i = 0; Unary(++i, ++i); Unary(i++, i++); TestLogger.Log(i); TestLogger.Log("Testing for loop..."); for (var l = 3; l < 7; l++) { TestLogger.Log(l.ToString()); } TestLogger.Log("Testing floating-point arithmetic..."); var x = ReadDouble("1.5"); var y = ReadDouble("2.0"); var z = ReadDouble("3.0"); TestLogger.Log((x * y)); TestLogger.Log((z / x)); TestLogger.Log((z / y)); TestLogger.Log(x < y); TestLogger.Log(x + y <= z); TestLogger.Log("Calculating primes..."); var primes = new Primes(10001); TestLogger.Log("Calculating pi..."); DigitsOfPi.Emit(primes); }
private static string nineDigitsAt(Primes primes, int n) { var N = (int)(((n + 20) * Math.Log(10.0)) / Math.Log(2.0)); var sum = 0.0; var primeIndex = 2; while (true) { if (primeIndex >= primes.Count) return null; var a = primes[primeIndex++]; if (a > 2 * N) { var digits = (int)(sum * 1e9); var str = "000000000" + digits; return str.Substring(str.Length - 9); } var vmax = (int)(Math.Log(2 * N) / Math.Log(a)); var av = 1; for (var i = 0; i < vmax; i++) av *= a; var s = 0; var num = 1; var den = 1; var v = 0; var kq = 1; var kq2 = 1; for (var k = 1; k <= N; k++) { var t = k; if (kq >= a) { do { t /= a; v--; } while ((t % a) == 0); kq = 0; } num = mul_mod(num, t, av); kq++; t = (2 * k) - 1; if (kq2 >= a) { if (kq2 == a) { do { t /= a; v++; } while ((t % a) == 0); } kq2 -= a; } den = mul_mod(den, t, av); kq2 += 2; if (v > 0) { t = mul_mod(mul_mod(inv_mod(den, av), num, av), k, av); for (var i = v; i < vmax; i++) t = mul_mod(t, a, av); s += t; if (s >= av) s -= av; } } s = mul_mod(s, pow_mod(10, n - 1, av), av); sum = fmod(sum + ((double)s / (double)av), 1.0); } }
public static void Emit(Primes primes) { TestLogger.Log("3."); var i = 2; while (true) { if (i + 9 > knownDigits.Length) { TestLogger.Log("Ran out of known digits to check against"); return; } var digits = nineDigitsAt(primes, i - 1); if (digits == null) { TestLogger.Log("Ran out of primes"); return; } if (digits != knownDigits.Substring(i, 9)) throw new InvalidOperationException("calculated digits do not agree with actual digits"); i += 9; TestLogger.Log(digits); } }
private static string nineDigitsAt(Primes primes, int n) { var N = (int)(((n + 20) * Math.Log(10.0)) / Math.Log(2.0)); var sum = 0.0; var primeIndex = 2; while (true) { if (primeIndex >= primes.Count) { return(null); } var a = primes[primeIndex++]; if (a > 2 * N) { var digits = (int)(sum * 1e9); var str = "000000000" + digits; return(str.Substring(str.Length - 9)); } var vmax = (int)(Math.Log(2 * N) / Math.Log(a)); var av = 1; for (var i = 0; i < vmax; i++) { av *= a; } var s = 0; var num = 1; var den = 1; var v = 0; var kq = 1; var kq2 = 1; for (var k = 1; k <= N; k++) { var t = k; if (kq >= a) { do { t /= a; v--; }while ((t % a) == 0); kq = 0; } num = mul_mod(num, t, av); kq++; t = (2 * k) - 1; if (kq2 >= a) { if (kq2 == a) { do { t /= a; v++; }while ((t % a) == 0); } kq2 -= a; } den = mul_mod(den, t, av); kq2 += 2; if (v > 0) { t = mul_mod(mul_mod(inv_mod(den, av), num, av), k, av); for (var i = v; i < vmax; i++) { t = mul_mod(t, a, av); } s += t; if (s >= av) { s -= av; } } } s = mul_mod(s, pow_mod(10, n - 1, av), av); sum = fmod(sum + ((double)s / (double)av), 1.0); } }