Пример #1
0
        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("  ");
        }
Пример #2
0
        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++;
            }
        }