public static void Dekodovani(ListBox listBox, long p, long q, long m) { if (p % 4 != 3 || q % 4 != 3) { throw new Exception("koeficienty nejsou delitelne 4 se zbytekem 3 "); } long m1, m2; m1 = m % p; m2 = m % q; string lajna = m.ToString() + "mod " + p + " ≡ " + m1; listBox.Items.Add(lajna); listBox.Items.Add(m.ToString() + "mod " + q + " ≡ " + m2); listBox.Items.Add(" "); lajna = "první m = √" + m1 + "^" + p + " ≡ ±"; long pRed = (p + 1) / 4; lajna = lajna + m1 + "^" + pRed; listBox.Items.Add(lajna); m1 = Umocnovac.Run(listBox, m1, pRed, p); if ((-(m1 - p)) % p < m1) { lajna = "m ≡ ±" + m1; m1 = (-(m1 - p)) % p; listBox.Items.Add(lajna + " ≡ ±" + m1); } else { listBox.Items.Add("m ≡ ±" + m1); } listBox.Items.Add(" "); lajna = "druhé m = √" + m2 + "^" + q + " ≡ ±"; long qRed = (q + 1) / 4; lajna = lajna + m2 + "^" + qRed; listBox.Items.Add(lajna); m2 = Umocnovac.Run(listBox, m2, qRed, q); if ((-(m2 - q)) % q < m2) { lajna = "m ≡ ±" + m2; m2 = (-(m2 - q)) % q; listBox.Items.Add(lajna + " ≡ ±" + m2); } else { listBox.Items.Add("m ≡ ±" + m2); } listBox.Items.Add("**************************************"); listBox.Items.Add("pro m ≡ " + m1 + " mod " + p + " & m ≡ " + m2 + "mod " + q); DHRovnice rovnice1 = Rovnice.Run(listBox, m1, p, m2, q); listBox.Items.Add("pro m ≡ " + (-m1) + " mod " + p + " & m ≡ " + m2 + "mod " + q); DHRovnice rovnice2 = Rovnice.Run(listBox, -m1, p, m2, q); listBox.Items.Add("**************************************"); long vysledek1 = rovnice1.Prava; long vysledek2 = -(vysledek1 - rovnice1.Leva) % rovnice1.Leva; long vysledek3 = rovnice2.Prava; long vysledek4 = -(vysledek3 - rovnice2.Leva) % rovnice2.Leva; listBox.Items.Add("vysledek: ±" + vysledek1 + ", ±" + vysledek2 + " | " + "±" + vysledek3 + ", " + "±" + vysledek4); listBox.Items.Add(" "); }
public static void Run(ListBox listBox, long mod) { long modPhi = Phi.phi((int)mod); string lajna = "φ" + mod + " = " + modPhi; listBox.Items.Add(lajna); lajna = modPhi.ToString(); long delitel = 2; List <long> listDelitele = new List <long>(); lajna = ""; while (modPhi > 1) { if (modPhi % delitel == 0) { lajna += modPhi + "=" + delitel + "*"; if (!listDelitele.Contains(delitel)) { listDelitele.Add(delitel); } modPhi = modPhi / delitel; lajna += modPhi + " "; } else { delitel++; } } listBox.Items.Add(lajna); lajna = "unikatni delitele jsou :"; listDelitele.ForEach(x => lajna += x.ToString() + ","); listBox.Items.Add(lajna); List <long> listPodminek = new List <long>(); modPhi = Phi.phi((int)mod); listDelitele.ForEach(x => listPodminek.Add(modPhi / x)); lajna = "budeme tedy kontrolovat že "; listPodminek.ForEach(x => lajna += " a^" + x); lajna += " nejsou kong. s 1 mod " + mod; listBox.Items.Add(lajna); listBox.Items.Add("********************************************"); long kandidat = 2; while (true) { if (!MathAsist.MyLib.IsPrime((int)kandidat)) { kandidat++; continue; } listBox.Items.Add("pro a = " + kandidat); bool uspech = true; foreach (var item in listPodminek) { long vysledek = Umocnovac.Run(listBox, kandidat, item, mod); if (vysledek == 1) { uspech = false; break; } } if (uspech) { listBox.Items.Add("našli jsme kořen: " + kandidat); listBox.Items.Add(" "); return; } kandidat++; } }