Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using System.Collections.Generic;
- using LUI;
- using System.Threading;
- using System.Data.Common;
- namespace LUI;
- static class Prime {
- public static uint[] p;
- const int size = 20000;
- static Prime() => P(size);
- static void P(int n) {
- p = new uint[n];
- int cnt = 1;
- p[0] = 2;
- while (cnt < n) {
- for (uint q = p[cnt - 1] + 1; ; q++) {
- bool f = true;
- for (int j = 0; j < cnt; j++)
- if (p[j] * p[j] > q) break;
- else if (q % p[j] == 0) { f = false; break; }
- if (f) { p[cnt++] = q; break; }
- }
- }
- }
- public static LUI FindPrime(LUI n0, bool f = true) {
- int m = Prime.p.Length;
- uint[] r = new uint[m];
- for (int i = 0; i < m; i++) {
- //Console.Write(i + " ");
- LUI ρ = (n0 / p[i]).r;
- if (ρ.IsZero) r[i] = 0;
- else r[i] = ρ.A[0];
- }
- //Console.WriteLine("Start\n");
- //DateTime tm0 = DateTime.UtcNow;
- for (uint d = 0; ; d++) {
- bool ff = true;
- for (int i = 1; i < m; i++) {
- if ((r[i] + d * (f ? 1 : -1)) % Prime.p[i] == 0) { ff = false; break; }
- }
- if (ff) {
- LUI n = f ? n0 + d : n0 - d;
- if (n.FPTest(2)) {
- //Console.WriteLine(DateTime.Now - tm0);
- return n;
- }
- //else Console.WriteLine(d);
- }
- }
- }
- public static LUI FindSG(LUI n0, bool f = true) {
- LUI n1 = n0 >> 1;
- int cnt0 = 0, cnt1 = 0;
- n1.SetBit(true, 0);
- uint[] r = new uint[p.Length];
- for (int i = 0; i < r.Length; i++) {
- /*
- LUI q = n1 % p[i];
- r[i] = q.IsZero ? 0 : (n1 % p[i]).A[0];
- */
- r[i] = n1.RemDivShort(p[i]);
- }
- for (uint d = 0; ; d += 2) {
- cnt0++;
- bool ff = true;
- for (int i = 0; i < p.Length; i++) {
- uint r1 = (r[i] + d) % p[i];
- ff &= r1 != 0;
- if (ff) {
- uint r2 = ((r[i] + d) * 2 + 1) % p[i];
- ff &= r2 != 0;
- }
- if (!ff) break;
- }
- if (ff) {
- Console.Clear();
- Console.WriteLine("{0,10}{1,10}", cnt0, ++cnt1);
- }
- if (ff) ff &= (n1 + d).FPTest(2);
- if (ff) ff = ((n1 + d) * 2 + 1).FPTest(2);
- if (ff) {
- Console.Clear();
- return (n1 + d) * 2 + 1;
- }
- }
- }
- }
- static class Arr {
- static Random rnd = new Random();
- public static int NZ0(uint[] a) {
- int res = a.Length;
- for (int i = a.Length - 1; i >= 0; i--)
- if (a[i] == 0) res--;
- else break;
- return res;
- }
- public static int NZ(uint[] a) {
- int n = NZ0(a);
- if (n == 0) return 0;
- int res = n << 5;
- for (uint m = (1u << 31); m > 0; m >>= 1)
- if ((a[n - 1] & m) == 0) res--;
- else break;
- return res;
- }
- public static uint[] Copy(uint[] a, bool f = false) {
- if (f) return Tr(a);
- uint[] aa = new uint[a.Length];
- a.CopyTo(aa, 0);
- return aa;
- }
- public static uint[] Tr(uint[] a) {
- uint[] aa = new uint[NZ0(a)];
- for (int i = 0; i < aa.Length; i++)
- aa[i] = a[i];
- return aa;
- }
- public static uint[] ShL(uint[] a, int n) {
- //Console.WriteLine("In ShL");
- //ShowH(a, "A");
- //Console.WriteLine("n = " + n);
- int n0 = NZ(a) + n;
- //Console.WriteLine("n0 = " + n0);
- //int n0 = (a.Length << 5) + n;
- // Console.WriteLine("n0 = " + n0);
- int nn = ((n0 - 1) >> 5) + 1;
- //Console.WriteLine("nn = " + nn);
- if (nn < a.Length) nn = a.Length;
- uint[] aa = new uint[nn];
- //Console.WriteLine("nn = " + nn);
- //a.CopyTo(aa, 0);
- int m0 = n >> 5, m1 = n & 0x1f;
- //Console.WriteLine("m0 = " + m0 + " m1 = " + m1);
- /*
- if (m0 > 0)
- for (int i = a.Length - 1; i >= 0; i--) {
- aa[i + m0] = aa[i]; aa[i] = 0;
- }
- */
- for (int i = NZ0(a) - 1; i >= 0; i--) {
- aa[i + m0] = a[i];
- }
- if (m1 > 0)
- for (int i = aa.Length - 1; i >= 0; i--) {
- ulong t = ((ulong)aa[i] << 32) | (i > 0 ? aa[i - 1] : 0);
- aa[i] = (uint)((t << m1) >> 32);
- }
- //ShowH(aa, "Result of ShiftLeft");
- return aa;
- }
- public static uint[] ShR(uint[] a, int n) {
- int n0 = n >> 5, n1 = n & 0x1f;
- uint[] aa = new uint[a.Length];
- for (int i = 0; i < aa.Length; i++) {
- int k = i - n0;
- if (k >= 0) aa[k] = a[i];
- }
- if (n1 > 0)
- for (int i = 0; i < aa.Length; i++) {
- ulong x = ((ulong)(i < aa.Length - 1 ? aa[i + 1] : 0) << 32) | aa[i];
- aa[i] = (uint)(x >> n1);
- }
- return aa;
- }
- public static bool GetBit(uint[] a, int n) {
- int n0 = n >> 5, n1 = n & 0x1f;
- return (a[n0] & (1u << n1)) > 0;
- }
- public static void SetBit(ref uint[] a, bool b, int n) {
- int n0 = n >> 5, n1 = n & 0x1f;
- if (b && n0 > a.Length - 1) {
- uint[] aa = new uint[n0 + 1];
- a.CopyTo(aa, 0);
- a = aa;
- }
- a[n0] = b ? a[n0] | (1u << n1) : a[n0] & ~(1u << n1);
- }
- public static void SetLen(ref uint[] a, int n) {
- uint[] aa = new uint[n];
- if (n > a.Length)
- a.CopyTo(aa, 0);
- else
- for (int i = 0; i < n; i++)
- aa[i] = a[i];
- a = aa;
- }
- public static uint[] Add(uint[] a, uint[] b) {
- int n = Math.Max(a.Length, b.Length);
- uint[] res = new uint[n + 1];
- uint c = 0;
- for (int i = 0; i < res.Length; i++) {
- ulong s = (ulong)c + (i < a.Length ? a[i] : 0) + (i < b.Length ? b[i] : 0);
- res[i] = (uint)s;
- c = (s > uint.MaxValue ? 1u : 0);
- }
- return res;
- }
- public static uint[] Sub(uint[] a, uint[] b) {
- uint[] res = new uint[Math.Max(a.Length, b.Length)];
- uint c = 0;
- for (int i = 0; i < res.Length; i++) {
- ulong x = (1ul << 32) + (i < a.Length ? a[i] : 0) -
- (ulong)c - (i < b.Length ? b[i] : 0);
- res[i] = (uint)x;
- c = x > uint.MaxValue ? 0 : 1u;
- }
- return res;
- }
- public static int Cmp(uint[] a, uint[] b) {
- uint[] aa = Tr(a), bb = Tr(b);
- if (aa.Length != bb.Length)
- return Math.Sign(aa.Length - bb.Length);
- for (int i = aa.Length - 1; i >= 0; i--)
- if (aa[i] < bb[i]) return -1;
- else if (aa[i] > bb[i]) return 1;
- return 0;
- }
- public static uint[] Mul(uint[] a, uint[] b) {
- uint[] res = new uint[a.Length + b.Length];
- for (int i = 0; i < NZ0(a); i++)
- for (int j = 0; j < NZ0(b); j++) {
- int k = i + j;
- ulong x = (ulong)a[i] * b[j];
- uint[] y = { (uint)x, (uint)(x >> 32) };
- for (int t = 0; t < 2; t++) {
- int kk = k + t;
- while (y[t] > 0) {
- ulong s = (ulong)res[kk] + y[t];
- res[kk] = (uint)s;
- y[t] = (s > uint.MaxValue ? 1u : 0);
- kk++;
- }
- }
- }
- return res;
- }
- public static (uint[] q, uint[] r) Div(uint[] a, uint[] b) {
- //Console.WriteLine("In Div");
- //Arr.ShowH(a, "A");
- //Arr.ShowH(b, "B");
- //Console.ReadLine();
- if (NZ0(b) == 0) return (null, null);
- uint[] aa = Copy(a);
- int k = NZ(b) - NZ(aa);
- int n = k > 0 ? 0 : -k + 1;
- //Console.WriteLine("n = " + n);
- uint[] bb = ShL(b, n);
- //ShowH(b, "B after shift");
- //Console.ReadLine();
- //Console.WriteLine("In Div");
- uint[] q = { 0 };
- while (true) {
- q = ShL(q, 1);
- if (Cmp(aa, bb) >= 0) {
- aa = Sub(aa, bb);
- q[0]++;
- }
- if (Cmp(bb, b) == 0) break;
- else bb = ShR(bb, 1);
- }
- //ShowH(q, "Q");
- return (q, aa);
- }
- public static (uint[] q, uint[] r) Div1(uint[] a, uint[] b) {
- //Console.WriteLine("In Div1");
- //ShowH(a, "A");
- //ShowH(b, "B");
- if (NZ0(b) == 0) return (null, null);
- if (Cmp(a, b) == -1) return (new uint[0], Copy(a));
- if (NZ0(a) < 3) {
- ulong x = (a.Length == 2 ? (ulong)a[1] << 32 : 0) | a[0];
- ulong y = (b.Length == 2 ? (ulong)b[1] << 32 : 0) | b[0];
- ulong g = x / y, h = x % y;
- return (new uint[] { (uint)g, (uint)(g >> 32) },
- new uint[] { (uint)h, (uint)(h >> 32) });
- }
- int k0 = NZ(b) & 0x1f;
- //int k0 = (32 - (NZ(b) & 0x1f)) & 0x1f;
- if (k0 != 0) k0 = 32 - k0;
- uint[] bb0 = ShL(b, k0);
- uint[] aa = ShL(a, k0);
- if (bb0.Length == 1) {
- bb0 = ShL(bb0, 32);
- aa = ShL(aa, 32);
- }
- int k1 = NZ0(aa) - NZ0(bb0);
- if (k1 < 0) return (new uint[0], Copy(a));
- uint[] bb = ShL(bb0, k1 << 5);
- SetLen(ref aa, aa.Length + 1);
- SetLen(ref bb, bb.Length + 1);
- //ShowH(aa, "AA");
- //ShowH(bb, "BB");
- int l = aa.Length;
- //ShowH(aa, "Aa");
- //ShowH(bb, "Bb");
- int p = aa.Length - 1;
- uint[] q = new uint[0];
- while (true) {
- //Console.WriteLine("p=" + p);
- uint[] u = { aa[p - 2], aa[p - 1], aa[p] };
- uint[] v = { bb[p - 2], bb[p - 1], bb[p] };
- //ShowH(u, "U");
- //ShowH(v, "V");
- uint[] w = Div(u, v).q;
- //Console.WriteLine("Back in Div1");
- //ShowH(w, "W0");
- uint[] bw = Mul(bb, w);
- if (Cmp(aa, bw) == -1) {
- w = Sub(w, new uint[] { 1 });
- bw = Sub(bw, bb);
- }
- aa = Sub(aa, bw);
- SetLen(ref aa, l);
- //q = ShL(q, 32);
- //q[0] = w[0];
- q = Add(Mul(q, new uint[] { 0, 1 }), w);
- if (Cmp(bb, bb0) == 1) {
- bb = ShR(bb, 32);
- //ShowH(aa, "Aa");
- //ShowH(bb, "Bb");
- p--;
- } else break;
- }
- //Console.WriteLine("OK");
- return (q, Sub(a, Mul(b, q)));
- }
- public static uint[] Rand(int n, int m = 0) {
- uint[] a = new uint[n];
- for (int i = 0; i < n * 8 - m; i++) {
- a[i >> 3] |= (uint)rnd.Next(16) << (i & 7) * 4;
- }
- return a;
- }
- public static string StrH(uint[] a) {
- string res = "";
- for (int i = a.Length - 1; i >= 0; i--)
- for (int j = 7; j >= 0; j--) {
- int q = (int)(a[i] >> (j * 4)) & 0xf;
- res += (char)(q < 10 ? (int)'0' + q : (int)'A' + (q - 10));
- }
- return res;
- }
- public static string StrD(uint[] a) {
- if (NZ0(a) == 0) return "0";
- uint[] aa = Copy(a);
- uint[] b = { 1000000000 };
- var l = new List<uint>();
- while (NZ(aa) > 0) {
- var x = Div(aa, b);
- l.Add(x.r[0]);
- aa = x.q;
- }
- string s = "";
- for (int i = l.Count - 1; i >= 0; i--) {
- string ss = l[i].ToString();
- if (i < l.Count - 1) ss = new String('0', 9 - ss.Length) + ss;
- s += ss;
- }
- return s;
- }
- public static void ShowH(uint[] a, string name = "") {
- if (name != "") Console.WriteLine(name + " =");
- string s = StrH(a);
- bool f = true;
- for (int i = 0; i < s.Length; i++) {
- if ((i & 3) == 0) f = !f;
- Console.ForegroundColor = f ?
- ConsoleColor.Yellow : ConsoleColor.Cyan;
- Console.Write(s[i]);
- }
- Console.ForegroundColor = ConsoleColor.White;
- Console.WriteLine("\n");
- }
- public static void ShowD(uint[] a, string name = "") {
- if (name != "")
- Console.WriteLine(name + " =");
- Console.WriteLine(StrD(a) + "\n");
- }
- }
- class LUI {
- uint[] a;
- public uint[] A => Arr.Copy(a);
- public int N => a.Length;
- public LUI(uint[] a) {
- this.a = Arr.Tr(a);
- }
- public LUI Copy => new LUI(a);
- public static LUI Rand(int size, int m = 0) => new LUI(Arr.Rand(size, m));
- public static LUI Rand1(int size) {
- LUI x = Rand(size);
- x.SetBit(true, (size << 5) - 1);
- return x;
- }
- public int NZ => Arr.NZ(a);
- public static implicit operator LUI(ulong n) =>
- new LUI(new uint[] { (uint)n, (uint)(n >> 32) });
- public bool IsZero => N == 0;
- public bool Eq(LUI x) => Arr.Cmp(a, x.a) == 0;
- public bool NEq(LUI x) => !Eq(x);
- public static bool operator >(LUI x, LUI y) =>
- Arr.Cmp(x.a, y.a) == 1;
- public static bool operator <(LUI x, LUI y) =>
- Arr.Cmp(x.a, y.a) == -1;
- public static bool operator >=(LUI x, LUI y) => !(x < y);
- public static bool operator <=(LUI x, LUI y) => !(x > y);
- public static LUI operator +(LUI x, LUI y) => new LUI(Arr.Add(x.a, y.a));
- public static LUI operator -(LUI x, LUI y) => new LUI(Arr.Sub(x.a, y.a));
- public static LUI operator *(LUI x, LUI y) => new LUI(Arr.Mul(x.a, y.a));
- public static LUI operator <<(LUI x, int n) {
- uint[] a = Arr.ShL(x.A, n);
- return new LUI(a);
- }
- public static LUI operator >>(LUI x, int n) {
- uint[] a = Arr.ShR(x.A, n);
- return new LUI(a);
- }
- public static (LUI q, LUI r) operator /(LUI x, LUI y) {
- var v = Arr.Div1(x.a, y.a);
- return (new LUI(v.q), new LUI(v.r));
- }
- public static LUI operator %(LUI x, LUI y) => (x / y).r;
- public uint RemDivShort(uint n) {
- uint[] x = new uint[N];
- x[0] = 1u % n;
- for (int i = 1; i < N; i++)
- x[i] = (uint)(((ulong)0x100000000 * x[i - 1]) % n);
- ulong s = 0;
- for (int i = 0; i < N; i++)
- s += ((ulong)a[i] * x[i]) % n;
- return (uint)(s % n);
- }
- public bool GetBit(int n) => Arr.GetBit(a, n);
- public void SetBit(bool b, int n) {
- Arr.SetBit(ref a, b, n);
- a = Arr.Tr(a);
- }
- public LUI Pow(int n) {
- if (n == 0) return 1;
- else if (n == 1) return Copy;
- LUI x = Pow(n / 2), y = x * x;
- return (n % 2 == 1 ? y * this : y);
- }
- public LUI ExpMod(LUI exp, LUI mod) {
- int n = exp.NZ;
- LUI res = 1;
- for (int i = n - 1; i >= 0; i--) {
- res = ((res * res) / mod).r;
- if (Arr.GetBit(exp.a, i))
- res = ((res * this) / mod).r;
- }
- return res;
- }
- public bool FPTest(uint b) =>
- ((LUI)b).ExpMod(this - 1, this).Eq(1);
- public static LUI GCD(LUI p, LUI q) {
- if (p.IsZero && q.IsZero) return null;
- else if (p.IsZero) return q.Copy;
- else if (q.IsZero) return p.Copy;
- else return GCD(q, (p / q).r);
- }
- public bool CoPrime(LUI n) => GCD(this, n).Eq(1);
- public LUI InvMod(LUI mod) {
- if (!CoPrime(mod)) return null;
- var list = new List<LUI>();
- LUI p = Copy, q = mod.Copy;
- while (!q.IsZero) {
- var x = p / q;
- list.Add(x.q);
- p = q.Copy;
- q = x.r;
- }
- int k = list.Count & 1;
- p = 1; q = 0;
- list[list.Count - 1] -= 1;
- for (int i = list.Count - 2 + k; i >= 0; i--) {
- LUI t = list[i] * p + q;
- q = p.Copy;
- p = t;
- }
- return q;
- }
- public void ShowH(string name = "") =>
- Arr.ShowH(a, name);
- public string StrD => Arr.StrD(A);
- public void ShowD(string name = "") =>
- Arr.ShowD(a, name);
- public static implicit operator LUI(string txt) {
- string txt1 = "";
- for (int i = 0; i < txt.Length; i++)
- if (Char.IsDigit(txt[i])) txt1 += txt[i];
- txt = txt1;
- int k = 0;
- for (int i = 0; i < txt.Length; i++)
- if (txt[i] != '0') break; else k++;
- txt = txt.Substring(k, txt.Length - k);
- if (txt == "") return 0;
- int r = txt.Length % 9;
- //Console.WriteLine("r = " + r);
- string[] s = new string[txt.Length / 9 + (r > 0 ? 1 : 0)];
- s[0] = txt.Substring(0, r > 0 ? r : 9);
- //Console.WriteLine(s[0]);
- if (txt.Length > s[0].Length) {
- txt1 = txt.Substring(s[0].Length, txt.Length - s[0].Length);
- for (int i = 1; i < s.Length; i++) {
- s[i] = txt1.Substring((i - 1) * 9, 9);
- //Console.WriteLine(s[i]);
- }
- }
- LUI res = 0;
- for (int i = 0; i < s.Length; i++) {
- res *= 1000000000u;
- res += uint.Parse(s[i]);
- }
- return res;
- }
- }
- static class RSA {
- public static (LUI p, LUI q, LUI n, LUI φ, LUI e, LUI d) PQ(int size, bool sg = false) {
- LUI n0 = LUI.Rand(size);
- n0.SetBit(true, (size << 5) - 1);
- LUI r;
- if ((size & 1) == 1) {
- r = LUI.Rand((size + 1) / 2, 4);
- } else r = LUI.Rand(size / 2);
- r.SetBit(true, (r.N << 5) - 1);
- LUI p = sg ? Prime.FindSG(r) : Prime.FindPrime(r);
- //Console.Beep(400, 2000);
- LUI q = sg ? Prime.FindSG((n0 / p).q) :
- Prime.FindPrime((n0 / p).q);
- //Console.Beep(800, 2000);
- LUI n = p * q;
- LUI φ = (p - 1) * (q - 1);
- LUI e = Prime.FindPrime(LUI.Rand(1) + ((LUI)1u << 32));
- while (!e.CoPrime(φ)) e += 2;
- LUI d = e.InvMod(φ);
- return (p, q, n, φ, e, d);
- }
- public static void Show(int size, bool hex, bool dcm, bool sg = false) {
- var v1 = PQ(size, sg);
- var v2 = PQ(size, sg);
- if (hex) {
- v1.p.ShowH("P1");
- v1.q.ShowH("Q1");
- v1.n.ShowH("N1 = P1·Q1");
- v1.φ.ShowH("φ(N1) = (P1–1)(Q1–1)");
- v1.e.ShowH("E1");
- v1.d.ShowH("D1 = E1^–1 (mod φ(N1))");
- v2.p.ShowH("P2");
- v2.q.ShowH("Q2");
- v2.n.ShowH("N2 = P2·Q2");
- v2.φ.ShowH("φ(N2) = (P2–1)(Q2–1)");
- v2.e.ShowH("E2");
- v2.d.ShowH("D2 = E2^–1 (mod φ(N2))");
- }
- if (dcm) {
- v1.p.ShowD("P1");
- v1.q.ShowD("Q1");
- v1.n.ShowD("N1 = P1·Q1");
- v1.φ.ShowD("φ(N1) = (P1–1)(Q1–1)");
- v1.e.ShowD("E1");
- v1.d.ShowD("D1 = E1^–1 (mod φ(N1))");
- v2.p.ShowD("P2");
- v2.q.ShowD("Q2");
- v2.n.ShowD("N2 = P2·Q2");
- v2.φ.ShowD("φ(N2) = (P2–1)(Q2–1)");
- v2.e.ShowD("E2");
- v2.d.ShowD("D2 = E2^–1 (mod φ(N2))");
- }
- bool f = v1.n < v2.n;
- LUI t0 = LUI.Rand(size) % (f ? v1.n : v2.n);
- LUI t1 = t0.ExpMod(f ? v1.d : v2.e, f ? v1.n : v2.n);
- string s1 = "T1 = T0^" + (f ? "D1" : "E2") + " mod N" + (f ? "1" : "2");
- LUI t2 = t1.ExpMod(f ? v2.e : v1.d, f ? v2.n : v1.n);
- string s2 = "T2 = T1^" + (f ? "E2" : "D1") + " mod N" + (f ? "2" : "1");
- LUI t3 = t2.ExpMod(f ? v2.d : v1.e, f ? v2.n : v1.n);
- string s3 = "T3 = T2^" + (f ? "D2" : "E1") + " mod N" + (f ? "2" : "1");
- LUI t4 = t3.ExpMod(f ? v1.e : v2.d, f ? v1.n : v2.n);
- string s4 = "T4 = T3^" + (f ? "E1" : "D2") + " mod N" + (f ? "1" : "2");
- if (hex) {
- t0.ShowH("T0");
- t1.ShowH(s1);
- t2.ShowH(s2);
- t3.ShowH(s3);
- t4.ShowH(s4);
- }
- if (dcm) {
- t0.ShowD("T0");
- t1.ShowD(s1);
- t2.ShowD(s2);
- t3.ShowD(s3);
- t4.ShowD(s4);
- }
- }
- }
- static class ElGamal {
- public static (LUI p, LUI g, LUI x, LUI gx, LUI y, LUI gy, LUI gxy, LUI gyx) Gen(int size) {
- LUI p = Prime.FindSG(LUI.Rand1(size));
- LUI g;
- for (g = 2; ; g += 1) {
- if (!g.ExpMod((p - 1) >> 1, p).Eq(1)) break;
- }
- LUI x;
- x = LUI.Rand(size) % p;
- LUI gx = g.ExpMod(x, p);
- LUI y;
- y = LUI.Rand(size) % p;
- LUI gy = g.ExpMod(y, p);
- LUI gxy = gx.ExpMod(y, p);
- LUI gyx = gy.ExpMod(x, p);
- return (p, g, x, gx, y, gy, gxy, gyx);
- }
- /*
- public static (LUI r, LUI s) DSign(LUI p, LUI g, LUI y) {
- LUI k = LUI.Rand(p.N);
- while (!(p - 1).CoPrime(k)) k += 1;
- LUI r=g.ExpMod()
- }
- */
- }
- class Ration {
- LUI nom, den;
- public LUI Nom => nom.Copy;
- public LUI Den => den.Copy;
- int sign;
- public int Sign => sign;
- public Ration(LUI nom, LUI den, int sign) {
- if (nom.IsZero || sign == 0) {
- this.nom = 0; this.den = 1; this.sign = 0;
- } else {
- LUI gcd = LUI.GCD(nom, den);
- this.nom = (nom / gcd).q;
- this.den = (den / gcd).q;
- this.sign = sign;
- }
- }
- public Ration(LUI x, int s) :
- this(x, 1, s) { }
- public Ration(long x, ulong y) :
- this((LUI)(ulong)Math.Abs(x), (LUI)y, Math.Sign(x)) { }
- public static implicit operator Ration(long x) => new Ration((ulong)Math.Abs(x), 1, Math.Sign(x));
- public Ration Copy =>
- new Ration(nom, den, sign);
- public bool IsZero => sign == 0;
- public bool IsInt => den.Eq(1);
- //public Ration Zero => new Ration(0, 0);
- public static Ration operator -(Ration x) =>
- new Ration(x.nom, x.den, -x.sign);
- public static Ration operator +(Ration x, Ration y) {
- //Console.WriteLine("In +");
- //Console.WriteLine(x.sign + " " + y.sign);
- if (x.sign == 0) return y.Copy;
- else if (y.sign == 0) return x.Copy;
- else {
- //Console.WriteLine("!?!");
- LUI u1 = x.nom * y.den;
- LUI u2 = x.den * y.nom;
- LUI nom, den;
- int sign;
- if (x.sign == y.sign) {
- nom = u1 + u2;
- //nom.ShowD("Nom1");
- sign = x.sign;
- } else {
- int s = Arr.Cmp(u1.A, u2.A);
- if (s == 0) return 0;
- else {
- nom = s == 1 ? u1 - u2 : u2 - u1;
- //nom.ShowD("Nom2");
- sign = x.sign * s;
- }
- }
- den = x.den * y.den;
- return new Ration(nom, den, sign);
- }
- }
- public static Ration operator -(Ration x, Ration y) => x + -y;
- public static Ration operator *(Ration x, Ration y) =>
- x.sign * y.sign == 0 ? 0 : new Ration(x.nom * y.nom, x.den * y.den, x.sign * y.sign);
- public static Ration operator /(Ration x, Ration y)
- => y.sign == 0 ? null : x * new Ration(y.den, y.nom, y.sign);
- public bool Eq(Ration x) =>
- nom.Eq(x.nom) && den.Eq(x.den) && sign == x.sign;
- public bool NEq(Ration x) => !Eq(x);
- public static bool operator >(Ration x, Ration y) => (x - y).sign == 1;
- public static bool operator <(Ration x, Ration y) => y > x;
- public string Str() {
- return (sign >= 0 ? "" : "–") + nom.StrD + (den.NEq(1) ? " / " + den.StrD : "");
- }
- public void Show(string name) {
- if (name != "") {
- Console.ForegroundColor = ConsoleColor.White;
- Console.Write(name + " = ");
- }
- Console.ForegroundColor = ConsoleColor.Yellow;
- Console.Write(nom.StrD);
- if (!IsInt) {
- Console.ForegroundColor = ConsoleColor.White;
- Console.Write("/");
- Console.ForegroundColor = ConsoleColor.Cyan;
- Console.WriteLine(den.StrD + "\n");
- }
- Console.ForegroundColor = ConsoleColor.White;
- }
- public static Ration[] SolveLinEq(Ration[,] m) {
- int n = m.GetLength(0), nn = n + 1;
- Ration[,] mm = new Ration[n, nn];
- for (int i = 0; i < n; i++)
- for (int j = 0; j < nn; j++)
- mm[i, j] = m[i, j].Copy;
- for (int i = 0; i < n; i++) {
- if (mm[i, i].IsZero) {
- int ii = i;
- for (int j = i + 1; j < n; j++)
- if (!mm[j, i].IsZero) { ii = j; break; }
- if (ii == i) return null;
- for (int j = i; j < nn; j++) {
- Ration tmp = mm[i, j].Copy; mm[i, j] = mm[ii, j].Copy; mm[ii, j] = tmp;
- }
- }
- Ration mii = mm[i, i].Copy;
- for (int j = i; j < nn; j++) mm[i, j] /= mii;
- for (int j = 0; j < n; j++)
- if (i != j) {
- Ration mji = mm[j, i].Copy;
- for (int k = i; k < nn; k++)
- mm[j, k] -= mm[i, k] * mji;
- }
- }
- Ration[] res = new Ration[n];
- for (int i = 0; i < n; i++) res[i] = mm[i, n];
- return res;
- }
- public string FltVal(int n) {
- if (IsZero) return "0";
- var x = nom / den;
- var q = x.q;
- var r = x.r;
- bool f = q > 0;
- string resI = Arr.StrD(q.A) + ".";
- int cnt = f ? resI.Length : 0;
- string resF = "";
- while (cnt < n) {
- x = (r * 10) / den;
- if (!x.q.IsZero) f = true;
- resF += Arr.StrD(x.q.A);
- if (f) cnt++;
- r = x.r;
- }
- return sign == -1 ? "-" : " " + resI + resF;
- }
- public void ShowFltVal(string name, int n) {
- if (name != "") Console.Write(name + " =");
- Console.WriteLine(FltVal(n) + "\n");
- }
- }
- class Z {
- public Ration[] a;
- public Z(Ration[] a) {
- this.a = new Ration[30];
- for (int i = 0; i < 30; i++)
- this.a[i] = a[i].Copy;
- }
- public static Z Z1() {
- Ration[] a = new Ration[30];
- for (int i = 0; i < 30; i++) a[i] = 0;
- a[N(1, 0, 0)] = 1;
- a[N(0, 1, 0)] = 1;
- a[N(0, 0, 1)] = 1;
- return new Z(a);
- }
- public static int N(int r2, int r3, int r5) =>
- (15 * r2 + 10 * r3 + 6 * r5) % 30;
- public static (int r2, int r3, int r5) R(int n) =>
- (n % 2, n % 3, n % 5);
- public static Z operator +(Z x, Z y) {
- Ration[] a = new Ration[30];
- for (int i = 0; i < 30; i++)
- a[i] = x.a[i] + y.a[i];
- return new Z(a);
- }
- public static Z operator *(Z x, Z y) {
- Ration[] a = new Ration[30];
- for (int i = 0; i < 30; i++) a[i] = 0;
- for (int i = 0; i < 30; i++)
- for (int j = 0; j < 30; j++) {
- Ration t = x.a[i] * y.a[j];
- var rx = R(i);
- var ry = R(j);
- int r2 = rx.r2 + ry.r2;
- if (r2 >= 2) { t *= 2; r2 -= 2; }
- int r3 = rx.r3 + ry.r3;
- if (r3 >= 3) { t *= 3; r3 -= 3; }
- int r5 = rx.r5 + ry.r5;
- if (r5 >= 5) { t *= 5; r5 -= 5; }
- int n = N(r2, r3, r5);
- a[n] += t;
- }
- return new Z(a);
- }
- public static Z Pow(int n) {
- if (n == 0) {
- Ration[] a = new Ration[30];
- for (int i = 0; i < 30; i++)
- a[i] = i == 0 ? 1 : 0;
- return new Z(a);
- } else if (n == 1) return Z1();
- else if (n == 1) return Z1();
- else {
- int m = n >> 1;
- Z z = Pow(m);
- z *= z;
- if ((n & 1) == 1) z *= Z1();
- return z;
- }
- }
- public void Show() {
- for (int i = 0; i < 30; i++) {
- Console.ForegroundColor = ConsoleColor.Yellow;
- Console.Write("(" + a[i].Str() + ")");
- Console.ForegroundColor = ConsoleColor.Cyan;
- Console.Write("(" + R(i).r2 + "," + R(i).r3 + "," + R(i).r5 + ")");
- Console.ForegroundColor = ConsoleColor.White;
- Console.Write(i < 29 ? " + " : "\n\n");
- }
- }
- }
- public static class Program {
- static Random rnd = new Random();
- public static void Main() {
- int size = 32;
- {
- Ration a = 2, b = 1;
- for (int i = 0; i < 7; i++) {
- b = (a / b + b) / 2;
- }
- Ration aa = b * b;
- aa.ShowFltVal("B²", 100);
- return;
- }
- {
- int S(int[] a) {
- int s = 0;
- for (int i = 0; i < a.Length; i++)
- s += a[i];
- return s;
- }
- Ration P2(int[] n, int[] q) {
- int s = S(n), sq0 = S(q);
- int sq = 0;
- for (int i = 0; i < n.Length; i++) {
- sq += q[i];
- if (q[i] == 1 && n[i] == 1)
- if (i > 0) return 0;
- else if (sq == sq0) return (Ration)n[0] / s;
- else return 0;
- }
- Ration p = 1;
- int ss = s;
- var nn = new int[n.Length];
- for (int i = 0; i < n.Length; i++) {
- nn[i] = n[i];
- if (q[i] == 0) p *= (Ration)(ss - n[i]) / ss;
- else {
- p *= (Ration)n[i] / ss;
- ss--;
- nn[i]--;
- }
- }
- return p * P1(nn);
- }
- Ration P1(int[] n) {
- int s = S(n);
- Ration a = 1;
- for (int i = 0; i < n.Length; i++)
- a *= (Ration)(s - n[i]) / s;
- int m = 1 << n.Length;
- Ration p = 0;
- for (int i = 1; i < m; i++) {
- var q = new int[n.Length];
- for (int j = 0; j < n.Length; j++)
- q[j] = (i >> j) & 1;
- p += P2(n, q);
- }
- return p / (1 - a);
- }
- Ration P(int k, int[] n) {
- int[] rot(int[] a, int t) {
- var r = new int[a.Length];
- for (int i = 0; i < a.Length; i++) {
- int j = (i + t) % a.Length;
- r[i] = a[j];
- }
- return r;
- }
- //if (k == 0) return P(n);
- int m = 1 << k;
- Ration p = 0;
- for (int i = 0; i < m; i++) {
- var q = new int[k];
- for (int j = 0; j < k; j++)
- q[j] = (i >> j) & 1;
- Ration pp = 1;
- int s = S(n);
- var nn = new int[n.Length];
- n.CopyTo(nn, 0);
- for (int j = 0; j < k; j++) {
- if (q[j] == 1) {
- if (nn[j] == 1) {
- pp = 0;
- break;
- } else {
- pp *= (Ration)nn[j] / s;
- nn[j]--;
- s--;
- }
- } else {
- pp *= (Ration)(s - nn[j]) / s;
- }
- }
- if (pp > 0) pp *= P1(rot(nn, k));
- p += pp;
- }
- return p;
- }
- int[] n = { 4, 3, 2 };
- Ration Σp = 0;
- for (int i = 0; i < n.Length; i++) {
- var p = P(i, n);
- p.Show("P" + (i + 1));
- p.ShowFltVal("P" + (i + 1), 25);
- Σp += p;
- }
- Σp.Show("Σp");
- return;
- /*
- Ration P(Ration k, Ration l, Ration m) {
- Ration s = k + l + m;
- if (k > 1 && l > 1 && m > 1) {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- //--+
- var b = (s - k) / s * (s - l) / s * m / s;
- //-+-
- var c = (s - k) / s * l / s * (s - 1 - m) / (s - 1);
- //-++
- var d = (s - k) / s * l / s * m / (s - 1);
- //+--
- var e = k / s * (s - 1 - l) / (s - 1) * (s - 1 - m) / (s - 1);
- //+-+
- var f = k / s * (s - 1 - l) / (s - 1) * m / (s - 1);
- //++-
- var g = k / s * l / (s - 1) * (s - 2 - m) / (s - 2);
- //+++
- var h = k / s * l / (s - 1) * m / (s - 2);
- return (b * P(k, l, m - 1) + c * P(k, l - 1, m) + d * P(k, l - 1, m - 1) + e * P(k - 1, l, m) + f * P(k - 1, l, m - 1) + g * P(k - 1, l - 1, m) + h * P(k - 1, l - 1, m - 1)) / (1 - a);
- } else if (k > 1 && l > 1 && m.Eq(1)) {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- //-+-
- var b = (s - k) / s * l / s * (s - 1 - m) / (s - 1);
- //+--
- var c = k / s * (s - 1 - l) / (s - 1) * (s - 1 - m) / (s - 1);
- //++-
- var d = k / s * l / (s - 1) * (s - 2 - m) / (s - 2);
- return (b * P(k, l - 1, m) + c * P(k - 1, l, m) + d * P(k - 1, l - 1, m)) / (1 - a);
- } else if (k > 1 && l.Eq(1) && m > 1) {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- //--+
- var b = (s - k) / s * (s - l) / s * m / s;
- //+--
- var c = k / s * (s - 1 - l) / (s - 1) * (s - 1 - m) / (s - 1);
- //+-+
- var d = k / s * (s - 1 - l) / (s - 1) * m / (s - 1);
- return (b * P(k, l, m - 1) + c * P(k - 1, l, m) + d * P(k - 1, l, m - 1)) / (1 - a);
- } else if (k.Eq(1) && l > 1 && m > 1) {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- //--+
- var b = (s - k) / s * (s - l) / s * m / s;
- //-+-
- var c = (s - k) / s * l / s * (s - 1 - m) / (s - 1);
- //-++
- var d = (s - k) / s * l / s * m / (s - 1);
- return (k / s + b * P(k, l, m - 1) + c * P(k, l - 1, m) + d * P(k, l - 1, m - 1)) / (1 - a);
- } else if (k > 1 && l.Eq(1) && m.Eq(1)) {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- //+--
- var b = k / s * (s - 1 - l) / (s - 1) * (s - 1 - m) / (s - 1);
- return (b * P(k - 1, l, m)) / (1 - a);
- } else if (k.Eq(1) && l > 1 && m.Eq(1)) {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- //-+-
- var b = (s - k) / s * l / s * (s - 1 - m) / (s - 1);
- return (k / s + b * P(k, l - 1, m)) / (1 - a);
- } else if (k.Eq(1) && l.Eq(1) && m > 1) {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- //--+
- var b = (s - k) / s * (s - l) / s * m / s;
- return (k / s + b * P(k, l, m - 1)) / (1 - a);
- } else {
- //---
- var a = (s - k) / s * (s - l) / s * (s - m) / s;
- return (k / s) / (1 - a);
- }
- }
- */
- //Console.WriteLine();
- //return;
- /*
- var p1 = P(4, 3, 2);
- Console.WriteLine(p1.Str() + "\n");
- var p2 = new Ration(4l, 9ul) * P(3, 2, 3) + new Ration(5l, 9ul) * P(3, 2, 4);
- Console.WriteLine(p2.Str() + "\n");
- var p3 = new Ration(4l, 9ul) * new Ration(3l, 8ul) * P(2, 3, 2) +
- new Ration(4l, 9ul) * new Ration(5l, 8ul) * P(2, 3, 3) + new Ration(5l, 9ul) * new Ration(3l, 9ul) * P(2, 4, 2) + new Ration(5l, 9ul) * new Ration(6l, 9ul) * P(2, 4, 3);
- Console.WriteLine(p3.Str() + "\n");
- Console.WriteLine((p1 + p2 + p3).Str() + "\n");
- */
- /*
- Ration k = 3, l = 4, m = 2, s = k + l + m;
- var p1 = P(k, l, m);
- p1.Show("P1");
- //Console.WriteLine(p1.Str() + "\n");
- var p2 =
- k / s * P(l, m, k - 1) +
- (s - k) / s * P(l, m, k);
- //Console.WriteLine(p2.Str() + "\n");
- p2.Show("P2");
- var p3 = k / s * l / (s - 1) * P(m, k - 1, l - 1) +
- k / s * (s - 1 - l) / (s - 1) * P(m, k - 1, l) +
- (s - k) / s * l / s * P(m, k, l - 1) +
- (s - k) / s * (s - l) / s * P(m, k, l);
- //Console.WriteLine(p3.Str() + "\n");
- p3.Show("P3");
- (p1 + p2 + p3).Show("P1 + P2 + P3");
- */
- return;
- }
- {
- //LUI p1 = "1042443771311239633413205559326281210808060675878177002445634643591787689255192449796971282493551506892638138246800852540130494467352800688977650758697725679057410608054679794944955023867278505654593907586461765174195228214914586283";
- //LUI p2 = "1215176752081434429245853189413984239769716343499290505892032427840248218030044596422573401149369786373776119185083811857169350074501076678373604084439000481696072429776618119456786683625872330685900209835383874974229742808167679907";
- //LUI p3 = "1115732040768242855356230620181871041901862061825902139505347985716338360539850494431733227529267279429978220744469165682423357430236501837432982915342647295526566114519526262803233363192058309682422079373409086020434213365704651547";
- LUI p = "104877538395683983366410382169067664128088998324969954776913609710709979673872106181302424272451630465255903890993699866432944529691302121829280875212192060249409981488097721928049610630033097449915456635611191146165881248842161083160683443076013973067893398700983745781152640174308826993566956033515645669283";
- LUI q = "133555787139965542016652020299042388774493285356924243918801203066549237266540858298157432621828743072406798037259250876162616325748283692572042900004902260407064923767113776920105687530531338672948803242326218839058724418795591109682123812450311938710290996517774382878398537530538544334387423518165986799247";
- p.ShowH("P");
- q.ShowH("Q");
- LUI n = p * q;
- LUI φ = (p - 1) * (q - 1);
- LUI e = Prime.FindPrime(LUI.Rand(1));
- LUI d = e.InvMod(φ);
- n.ShowD("N");
- e.ShowD("E");
- d.ShowD("D");
- LUI t0 = LUI.Rand(n.N) % n;
- t0.ShowD("T0");
- LUI t1 = t0.ExpMod(e, n);
- t1.ShowD("T1");
- LUI t2 = t1.ExpMod(d, n);
- t2.ShowD("T2");
- Console.WriteLine(t0.Eq(t2));
- return;
- }
- /*
- {
- LUI m = LUI.Rand(8);
- m.ShowD("M");
- //var v = ElGamal.Gen(size);
- LUI p = "104877538395683983366410382169067664128088998324969954776913609710709979673872106181302424272451630465255903890993699866432944529691302121829280875212192060249409981488097721928049610630033097449915456635611191146165881248842161083160683443076013973067893398700983745781152640174308826993566956033515645669283";
- //LUI q = "133555787139965542016652020299042388774493285356924243918801203066549237266540858298157432621828743072406798037259250876162616325748283692572042900004902260407064923767113776920105687530531338672948803242326218839058724418795591109682123812450311938710290996517774382878398537530538544334387423518165986799247";
- //LUI p = "1220251634350225977687049836324995396915571036663148756072312277613143771856010961360650116892529677586646678213189183903471802445096501264713053398827645108144546563333650685364968197955792005605450737325870584138986692939916339039";
- //LUI p = v.p;
- p.ShowD("P");
- Console.WriteLine($"({Arr.StrD(p.A).Length})");
- Console.WriteLine(p.FPTest((uint)LUI.Rand(1).A[0]));
- Console.WriteLine((p >> 1).FPTest((uint)LUI.Rand(1).A[0]));
- LUI g = 2;
- while (g.ExpMod((p - 1) >> 1, p).Eq(1)) g += 1;
- g.ShowD("G");
- LUI x = LUI.Rand(size) % p;
- x.ShowD("X");
- LUI y = g.ExpMod(x, p);
- y.ShowD("Y = (G^X mod P)");
- LUI k = LUI.Rand(p.N) % p;
- while (!k.CoPrime(p - 1)) k += 1;
- k.ShowD("K");
- LUI r = g.ExpMod(k, p);
- r.ShowD("R = (G^K mod P)");
- LUI t1 = m % (p - 1);
- LUI t2 = (r * x) % (p - 1);
- LUI t = (t1 > t2 ? t1 - t2 : (p - 1 + t1 - t2)) % (p - 1);
- LUI s = (t * k.InvMod(p - 1)) % (p - 1);
- s.ShowD("S = (M–RX)·K^–1 mod P–1");
- LUI w1, w2;
- (w1 = g.ExpMod(m, p)).ShowD("G^M mod P");
- (w2 = (y.ExpMod(r, p) * r.ExpMod(s, p)) % p).ShowD("(Y^R)·(R^S) mod P");
- Console.WriteLine(w1.Eq(w2));
- return;
- }
- */
- /*
- {
- DateTime tm0 = DateTime.Now;
- Z[] z = new Z[31];
- for (int i = 0; i <= 30; i++)
- z[i] = Z.Pow(i);
- Console.WriteLine("OK");
- //return;
- int n = 30;
- Ration[,] m = new Ration[n, n + 1];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++)
- m[i, j] = z[j].a[i];
- m[i, n] = -z[n].a[i];
- }
- Ration[] k = Ration.SolveLinEq(m);
- Ration[] α = new Ration[31];
- Console.WriteLine(DateTime.Now - tm0);
- string str = "";
- string txt0 = "0";
- string txt = "0";
- string X = "(2^(1/2)+3^(1/3)+5^(1/5))";
- string pw = "⁰¹²³⁴⁵⁶⁷⁸⁹";
- string Pow(int n) {
- string s = n.ToString(), res = "";
- foreach (char c in s)
- res += pw[(int)(c - '0')];
- return res;
- }
- long[] q = new long[31];
- for (int i = 30; i >= 0; i--) {
- α[i] = i == 30 ? new Ration(1, 1, 1) : k[i].Copy;
- bool f0 = α[i].Sign == 0;
- bool f1 = α[i].Nom.Eq(1);
- str += (f0 ? "" : (α[i].Sign < 0 ? " – " : (str == "" ? "" : " + ")) + (f1 ? "" : α[i].Nom.A[0].ToString()) + (i > 0 ? "x" : "") + (i > 1 ? Pow(i) : ""));
- long h = i == 30 ? 1 : (k[i].IsZero ? 0 : (long)k[i].Nom.A[0] * k[i].Sign);
- //q[i] = i == 30 ? 1 : (k[i].IsZero ? 0 : (long)k[i].Nom.A[0] * k[i].Sign);
- txt0 = "(" + txt0 + ")" + "t" + (h < 0 ? h : "+" + h);
- txt = "(" + txt + ")" + X + (h < 0 ? h : "+" + h);
- }
- Console.WriteLine(str);
- Console.WriteLine(txt0);
- Console.WriteLine(txt);
- Console.ReadLine();
- for (int i = 0; i < n; i++) {
- Console.ForegroundColor = ConsoleColor.Green;
- Console.WriteLine(m[i, n].Str());
- Ration s = 0;
- for (int j = 0; j < n; j++) s += m[i, j] * k[j];
- Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine(s.Str() + "\n");
- }
- Console.ForegroundColor = ConsoleColor.White;
- //Z.Pow(30).Show();
- return;
- }
- */
- /*
- {
- LUI p = "37605860339154331679080579905998844540066114455761079119382916420484313254321328050681891452905231893193699510228303";
- p.ShowD("P");
- Console.WriteLine(p.FPTest(210));
- (p >> 1).ShowD("(P–1)/2");
- Console.WriteLine((p >> 1).FPTest(210));
- LUI q = "34376587942203771050451147160461810819833374251570386618341800117863423913380583670105177918021715768498881439527763";
- q.ShowD("Q");
- Console.WriteLine(q.FPTest(210));
- (q >> 1).ShowD("(Q–1)/2");
- Console.WriteLine((q >> 1).FPTest(210));
- return;
- }
- */
- /*
- {
- int size = 12;
- var v = ElGamal.Gen(size);
- while (true) {
- Console.Clear();
- v.p.ShowH("P");
- v.p.ShowD();
- v.g.ShowD("G");
- LUI k = LUI.Rand(size) % v.p;
- k.ShowH("K");
- k.ShowD();
- LUI a = v.g.ExpMod(k, v.p);
- a.ShowH("A");
- a.ShowD();
- LUI m0 = LUI.Rand(size) % v.p;
- m0.ShowH("M0");
- m0.ShowD();
- LUI b = (m0 * v.gx.ExpMod(k, v.p)) % v.p;
- b.ShowH("B");
- b.ShowD();
- LUI m1 = (b * a.InvMod(v.p).ExpMod(v.x, v.p)) % v.p;
- m1.ShowH("M1");
- m1.ShowD();
- Console.ReadLine();
- }
- return;
- */
- {
- var v = ElGamal.Gen(size);
- v.p.ShowH("P");
- v.p.ShowD();
- v.g.ShowH("G");
- v.g.ShowD();
- v.x.ShowH("X");
- v.x.ShowD();
- v.gx.ShowH("G^X mod P");
- v.gx.ShowD();
- v.y.ShowH("Y");
- v.y.ShowD();
- v.gy.ShowH("G^Y mod P");
- v.gy.ShowD();
- v.gxy.ShowH("(G^X)^Y mod P");
- v.gxy.ShowD();
- v.gyx.ShowH("(G^Y)^X mod P");
- v.gyx.ShowD();
- Console.WriteLine("\n\n");
- return;
- }
- /*
- {
- LUI n = Prime.FindSG(LUI.Rand1(size), true);
- n.ShowH("N");
- n.ShowD();
- LUI g;
- for (g = 2; ; g += 1) {
- if (!g.ExpMod(n >> 1, n).Eq(1)) break;
- }
- Console.WriteLine();
- g.ShowD("G");
- LUI x = LUI.Rand(size);
- x.ShowH("X");
- x.ShowD();
- LUI y = LUI.Rand(size);
- y.ShowH("Y");
- y.ShowD();
- LUI xx = g.ExpMod(x, n);
- xx.ShowH("G^X mod N");
- xx.ShowD();
- LUI yy = g.ExpMod(y, n);
- yy.ShowH("G^Y mod N");
- yy.ShowD();
- LUI k1 = yy.ExpMod(x, n);
- k1.ShowH("K1 = (G^Y mod N)^X mod N");
- k1.ShowD();
- LUI k2 = xx.ExpMod(y, n);
- k2.ShowH("K2 = (G^X mod N)^Y mod N");
- k2.ShowD();
- return;
- }
- */
- {
- RSA.Show(size, true, true, false);
- Console.WriteLine("\n\n\n");
- return;
- }
- {
- for (LUI x = ((LUI)10).Pow(50); ; x -= 1) {
- Console.Clear();
- x.ShowH();
- if (x.FPTest(2))
- break;
- }
- Console.WriteLine("OK");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement