3 using System.Reflection;
8 internal class TestMath {
10 internal static void Main(string[] args)
14 } catch (Exception e) {
15 Console.WriteLine(e.ToString());
20 static ZInt RandPrime(int k)
23 throw new ArgumentException();
25 ZInt min = ZInt.One << (k - 1);
26 ZInt max = ZInt.One << k;
28 ZInt p = ZInt.MakeRand(min, max) | 1;
35 internal static void TestModInt()
37 Console.Write("Test ModInt: ");
38 for (int k = 2; k <= 128; k ++) {
39 for (int i = 0; i < 10; i ++) {
40 int kwlen = (k + 30) / 31;
45 p = ZInt.DecodeUnsignedBE(
47 if (p.BitLength != k) {
59 ZInt a = ZInt.MakeRand(p);
60 ZInt b = ZInt.MakeRand(p);
61 ZInt v = ZInt.MakeRand(k + 60);
65 byte[] ea = a.ToBytesBE();
66 byte[] eb = b.ToBytesBE();
67 byte[] ev = v.ToBytesBE();
68 ModInt mz = new ModInt(p.ToBytesBE());
78 CheckEq(ma, (a + b).Mod(p));
83 CheckEq(ma, (a - b).Mod(p));
87 CheckEq(ma, (-a).Mod(p));
92 CheckEq((ZInt.DecodeUnsignedBE(ma.Encode())
93 << kwb).Mod(p), (a * b).Mod(p));
97 CheckEq(ma, (a << kwb).Mod(p));
107 CheckEq(ma, (a * b).Mod(p));
111 ZInt r = ZInt.DecodeUnsignedBE(mb.Encode());
112 CheckEq(ZInt.One, (r * b).Mod(p));
116 CheckEq(ma, ZInt.ModPow(a, v, p));
119 CheckEq(ma, v.Mod(p));
125 ModInt mv = new ModInt(
126 ((p << 61) + 1).ToBytesBE());
129 CheckEq(ma, v.Mod(p));
136 if ((int)mb.SqrtBlum() != -1) {
137 throw new CryptoException(
138 "square root failed");
150 if (mb.SqrtBlum() != 0) {
151 throw new CryptoException(
159 Console.WriteLine(" done.");
162 static void CheckEq(ModInt m, ZInt z)
164 CheckEq(ZInt.DecodeUnsignedBE(m.Encode()), z);
167 static void CheckEq(ZInt x, ZInt z)
170 throw new Exception(String.Format(
171 "mismatch: x={0} z={1}", x, z));