/// <summary> /// Compute the value using /// <see cref="Modular.Mod(long, long)"/> /// . /// </summary> internal virtual double Compute_modular() { long e = E.value; long n = N.value; double s = 0; for (; e > E.limit; e += E.delta) { s = Modular.AddMod(s, Modular.Mod(e, n) / (double)n); n += N.delta; } return(s); }
internal static void ModBenchmarks() { Util.Timer t = new Util.Timer(false); t.Tick("modBenchmarks()"); long[][][] en = GenerateEN(10000, 10); t.Tick("generateEN"); for (int i = 0; i < en.Length; i++) { long n = en[i][0][0]; for (int j = 1; j < en[i].Length; j++) { long e = en[i][j][0]; long answer = en[i][j][1]; long s = Modular.Mod(e, n); if (s != answer) { NUnit.Framework.Assert.AreEqual("e=" + e + ", n=" + n + ", answer=" + answer + " but s=" + s, answer, s); } } } t.Tick("Modular.mod"); TestModular.Montgomery2 m2 = new TestModular.Montgomery2(); for (int i_1 = 0; i_1 < en.Length; i_1++) { long n = en[i_1][0][0]; m2.Set(n); for (int j = 1; j < en[i_1].Length; j++) { long e = en[i_1][j][0]; long answer = en[i_1][j][1]; long s = m2.Mod(e); if (s != answer) { NUnit.Framework.Assert.AreEqual("e=" + e + ", n=" + n + ", answer=" + answer + " but s=" + s, answer, s); } } } t.Tick("montgomery.mod"); for (int i_2 = 0; i_2 < en.Length; i_2++) { long n = en[i_2][0][0]; m2.Set(n); for (int j = 1; j < en[i_2].Length; j++) { long e = en[i_2][j][0]; long answer = en[i_2][j][1]; long s = m2.Mod2(e); if (s != answer) { NUnit.Framework.Assert.AreEqual("e=" + e + ", n=" + n + ", answer=" + answer + " but s=" + s, answer, s); } } } t.Tick("montgomery.mod2"); for (int i_3 = 0; i_3 < en.Length; i_3++) { long n = en[i_3][0][0]; BigInteger N = BigInteger.ValueOf(n); for (int j = 1; j < en[i_3].Length; j++) { long e = en[i_3][j][0]; long answer = en[i_3][j][1]; long s = Two.ModPow(BigInteger.ValueOf(e), N); if (s != answer) { NUnit.Framework.Assert.AreEqual("e=" + e + ", n=" + n + ", answer=" + answer + " but s=" + s, answer, s); } } } t.Tick("BigInteger.modPow(e, n)"); }