コード例 #1
0
ファイル: Rovnice.cs プロジェクト: ValuCZ/MB104
        public static DHRovnice Run(ListBox listBox, long Q1, long mod1, long Q2, long mod2)
        {
            if (mod2 > mod1)
            {
                long mezi = mod2;
                mod2 = mod1;
                mod1 = mezi;
                mezi = Q2;
                Q2   = Q1;
                Q1   = mezi;
            }
            DHRovnice rovnice1 = new DHRovnice();
            DHRovnice rovnice2 = new DHRovnice();
            long      prava1   = Q2 * mod1;
            string    lajna    = mod1.ToString() + "c" + " ≡ " + Q2.ToString() + "∙" + mod1.ToString() + " ≡ " + prava1.ToString();

            listBox.Items.Add(lajna);
            long prava2 = Q1 * mod2;

            lajna = mod2.ToString() + "c" + " ≡ " + Q1.ToString() + "∙" + mod2.ToString() + " ≡ " + prava2.ToString();
            listBox.Items.Add(lajna);
            listBox.Items.Add("--------------------------------------");
            rovnice1.Prava = prava1; rovnice2.Prava = prava2; rovnice1.Leva = mod1; rovnice2.Leva = mod2;
            while (rovnice1.Leva > 1 && rovnice2.Leva > 1)
            {
                DHRovnice taVetsi;
                DHRovnice taMensi;
                if (rovnice1.Leva > rovnice2.Leva)
                {
                    taVetsi = rovnice1; taMensi = rovnice2;
                }
                else
                {
                    taVetsi = rovnice2; taMensi = rovnice1;
                }
                int  q         = (int)(taVetsi.Leva / taMensi.Leva);
                long novaLeva  = taVetsi.Leva - q * taMensi.Leva;
                long novaPrava = taVetsi.Prava - q * taMensi.Prava;
                lajna = novaLeva.ToString() + "c" + " ≡ " + taVetsi.Prava.ToString() + " - (" + q.ToString() + "∙" + taMensi.Prava.ToString() +
                        ") ≡ " + novaPrava.ToString();
                taVetsi.Leva  = novaLeva;
                taVetsi.Prava = novaPrava; listBox.Items.Add(lajna);
            }
            long bigModul = mod1 * mod2;
            long theCislo = rovnice1.Leva > rovnice2.Leva ? rovnice2.Prava : rovnice1.Prava;

            theCislo = theCislo % bigModul;
            lajna    = "c ≡ " + theCislo.ToString() + " (mod " + (bigModul).ToString() + ")";
            if (theCislo < 0)
            {
                theCislo = theCislo + bigModul;
                lajna    = lajna + " ≡ " + theCislo.ToString() + "(mod " + bigModul.ToString() + ")";
            }
            listBox.Items.Add(lajna);
            rovnice1.Prava = theCislo; rovnice2.Prava = theCislo;
            rovnice1.Leva  = bigModul; rovnice2.Leva = bigModul;
            return(rovnice1.Leva > rovnice2.Leva ? rovnice2 : rovnice1);
        }
コード例 #2
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("  ");
        }
コード例 #3
0
        private void button3_Click(object sender, EventArgs e)
        {
            long message = Int32.Parse(m.Text);
            long qE      = Int32.Parse(E.Text);
            long Q       = Int32.Parse(q.Text);
            long P       = Int32.Parse(p.Text);

            listBox2.Items.Clear();
            string lajna = "φ(" + P.ToString() + "∙" + Q.ToString() + ")" + " = ";
            long   Pz = P; long Qz = Q;

            P = Phi.phi((int)P);
            Q = Phi.phi((int)Q);
            long d = P * Q;

            lajna = lajna + P.ToString() + "∙" + Q.ToString() + " = " + d.ToString();
            listBox2.Items.Add(lajna);
            lajna = d.ToString() + "d" + " ≡ " + "0";
            listBox2.Items.Add(lajna);
            lajna = qE.ToString() + "d" + " ≡ " + "1";
            listBox2.Items.Add(lajna); listBox2.Items.Add("-------------------------");
            DHRovnice rovnice = Inverze.Run(listBox2, d, qE);

            listBox2.Items.Add("--------------------------");
            long umocneni = rovnice.Prava;

            lajna = "m ≡" + message + "^" + umocneni + "≡";
            long c1 = message % Pz;
            long m1 = umocneni % Phi.phi((int)Pz);

            lajna = lajna + c1 + "^" + m1;  listBox2.Items.Add(lajna);
            long finalni1 = Umocnovac.Run(listBox2, c1, m1, Pz);

            lajna = "m" + " ≡ " + finalni1 + " (mod" + Pz + ")";
            listBox2.Items.Add(lajna);
            long c2 = message % Qz;
            long m2 = umocneni % Phi.phi((int)Qz);

            lajna = "m ≡" + message + "^" + umocneni + "≡" + c2 + "^" + m2;
            listBox2.Items.Add(lajna);
            long finalni2 = Umocnovac.Run(listBox2, c2, m2, Qz);

            lajna = "m" + " ≡ " + finalni2 + " (mod" + Qz + ")";

            listBox2.Items.Add(lajna); listBox2.Items.Add("-----------------------------");
            Rovnice.Run(listBox2, finalni1, Pz, finalni2, Qz);
        }
コード例 #4
0
        public static void Kodovani(ListBox listBox, long p, long q, long m)
        {
            long   c1    = m % p;
            long   c2    = m % q;
            string lajna = "c ≡" + m + "^2" + " ≡ " + c1 + "^2" + " ≡ ";

            c1    = c1 * c1; c1 = c1 % p;
            lajna = lajna + c1 + " (mod " + p + ")";
            listBox.Items.Add(lajna);
            lajna = "c ≡" + m + "^2" + " ≡ " + c2 + "^2" + " ≡ ";
            c2    = c2 * c2; c2 = c2 % q;
            lajna = lajna + c2 + " (mod " + q + ")";
            listBox.Items.Add(lajna);
            DHRovnice rovnice  = Rovnice.Run(listBox, c1, p, c2, q);
            long      bigModul = rovnice.Leva;
            long      c        = rovnice.Prava;

            lajna = "vysledek = " + c + "(mod " + bigModul + ")";
            listBox.Items.Add(lajna);
        }
コード例 #5
0
        private void button2_Click(object sender, EventArgs e)
        {
            listBox2.Items.Clear();
            long          message = Int32.Parse(m.Text);
            long          qE      = Int32.Parse(E.Text);
            long          Q       = Int32.Parse(q.Text);
            long          P       = Int32.Parse(p.Text);
            StringBuilder builder = new StringBuilder();

            builder.Append("c ≡ ");
            builder.Append(message.ToString()); builder.Append(" ^ "); builder.Append(qE.ToString());
            long c1       = message % P;
            long reducedE = (long)(qE % MathEngine.Phi.phi((int)P));

            builder.Append(" ≡ "); builder.Append(c1); builder.Append(" ^ "); builder.Append(reducedE);
            listBox2.Items.Add(builder.ToString()); builder.Clear();
            c1 = Umocnovac.Run(listBox2, c1, reducedE, P);

            builder.Append(" ≡ "); c1 = c1 % P; builder.Append(c1);
            builder.Append(" (mod" + P.ToString() + ")");
            listBox2.Items.Add(builder.ToString());
            builder.Clear();
            ///////////////////////////
            builder.Append("c ≡ ");
            builder.Append(message.ToString()); builder.Append(" ^ "); builder.Append(qE.ToString());
            long c2        = message % Q;
            long reducedE2 = qE % MathEngine.Phi.phi((int)Q);

            builder.Append(" ≡ "); builder.Append(c2); builder.Append(" ^ "); builder.Append(reducedE2);
            listBox2.Items.Add(builder.ToString()); builder.Clear();
            c2 = Umocnovac.Run(listBox2, c2, reducedE2, Q);

            builder.Append(" ≡ "); c2 = c2 % Q; builder.Append(c2);
            builder.Append(" (mod" + Q.ToString());
            listBox2.Items.Add(builder.ToString() + ")");
            builder.Clear();
            listBox2.Items.Add("------------------------------------------------------");
            DHRovnice rovnice = Rovnice.Run(listBox2, c1, P, c2, Q);
        }
コード例 #6
0
        public static DHRovnice Run(ListBox listBox, long d0, long d1)
        {
            DHRovnice rovnice1 = new DHRovnice();
            DHRovnice rovnice2 = new DHRovnice();

            rovnice1.Leva = d0; rovnice1.Prava = 0;
            rovnice2.Leva = d1; rovnice2.Prava = 1;
            string    lajna;
            DHRovnice taVetsi;
            DHRovnice taMensi;

            while (rovnice1.Leva > 1 && rovnice2.Leva > 1)
            {
                if (rovnice1.Leva > rovnice2.Leva)
                {
                    taVetsi = rovnice1; taMensi = rovnice2;
                }
                else
                {
                    taVetsi = rovnice2; taMensi = rovnice1;
                }
                int  q         = (int)(taVetsi.Leva / taMensi.Leva);
                long novaLeva  = taVetsi.Leva - q * taMensi.Leva;
                long novaPrava = taVetsi.Prava - q * taMensi.Prava;
                lajna = novaLeva.ToString() + "d" + " ≡ " + taVetsi.Prava.ToString() + " - (" + q.ToString() + "∙" + taMensi.Prava.ToString() +
                        ") ≡ " + novaPrava.ToString();
                taVetsi.Leva  = novaLeva;
                taVetsi.Prava = novaPrava; listBox.Items.Add(lajna);
            }
            taMensi = rovnice1.Leva > rovnice2.Leva ? rovnice2 : rovnice1;
            if (taMensi.Prava < 0)
            {
                taMensi.Prava = taMensi.Prava + d0;
                lajna         = "d  ≡ " + taMensi.Prava.ToString();
                listBox.Items.Add(lajna);
            }

            return(taMensi);
        }