Пример #1
0
 public static cpolinom CreateRand(int n, int m)
 {
     cpolinom c = new cpolinom("", m);
     for (int i = 0; i < n; i++)
         c.Add(Mod(r.Next(), m));
     while (c[0] == 0)
         c.RemoveAt(0);
     return c;
 }
Пример #2
0
 public cpolinom InvPolinom(cpolinom n)
 {
     cpolinom x = new cpolinom("1", n.mod);
     cpolinom y = Copy(this);
     cpolinom r;
     while (true)
     {
         r = (x * y) % n;
         if (r.x[0] == 1 && r.Count == 1)
             break;
         else
             x++;
     }
     return x;
 }
Пример #3
0
        public static List<cpolinom> Primes(int n, int mod)
        {
            List<cpolinom> r = new List<cpolinom>();
            cpolinom t = new cpolinom("", mod);

            cpolinom temp = new cpolinom("1 0", mod);

            r.Add(Copy(temp));
            temp++;

            while (temp.Count != n + 2)
            {
                for (int i = 0; i < r.Count; i++)
                {
                    t = temp % r[i];
                    if (t.Count == 1 && t[0] == 0)
                        break;
                }
                if (t.Count > 1 || (t.Count == 1 && t[0] != 0))
                    r.Add(Copy(temp));
                temp++;
            }
            return r;
        }
Пример #4
0
        public cpolinom meth2_49(cpolinom n)
        {
            cpolinom u = Copy(this);
            cpolinom v = Copy(n);
            cpolinom g1 = new cpolinom("1", n.mod);
            cpolinom g2 = new cpolinom("0", n.mod);

            while (u.Count != 1 && v.Count != 1)
            {
                Fix(u);
                Fix(v);
                Fix(g1);
                Fix(g2);
                cpolinom z = new cpolinom("1 0", n.mod);

                while ((u % z).isZero() == true)
                {
                    u = u / z;
                    if (g1.isZero() == true)
                        g1 = (g1 + n) / z;
                    while ((g1 % z).isZero() == false)
                        g1 = g1 + n;
                    g1 = g1 / z;
                }

                while ((v % z).isZero() == true)
                {
                    v = v / z;
                    if (g2.isZero() == true)
                        g2 = (g2 + n) / z;
                    while ((g2 % z).isZero() == false)
                        g2 = g2 + n;
                    g2 = g2 / z;                    
                }
                
                if (u.Count > v.Count)
                {
                    u = u + Copy(v);
                    g1 = g1 + g2;
                }
                else
                {
                    v = v + Copy(u);
                    g2 = g2 + g1;
                }
            }
            Fix(g1);
            Fix(g2);
            cpolinom g;
            if (u.Count == 1)
                g = g1;
            else
                g = g2;
            cpolinom t = ((g * this) % n);
            while (t.isOne() == false)
            {
                g = g + g;
                t = ((g * this) % n);
            }
            return g;
        }
Пример #5
0
 private int Zeros(cpolinom a, cpolinom b)
 {
     int n = 0;
     for (int i = a.Count - 1; i > -1; i--)
     {
         if (a[i] == 0) n++;
         else break;
     }
     for (int i = b.Count - 1; i > -1; i--)
     {
         if (b[i] == 0) n++;
         else break;
     }
     return n;
 }
Пример #6
0
        public cpolinom Inv3Polinom(cpolinom n)
        {
            cpolinom a = new cpolinom("1", n.mod);
            cpolinom b = Copy(this);
            cpolinom v = new cpolinom("0", n.mod);
            cpolinom p = Copy(n);
            int d = -1;

            p = new cpolinom("1 0 0 1 1", 2);
            a = new cpolinom("1 1 0 1", 2);
            b = new cpolinom("1 1 1", 2);

            StreamWriter sw = new StreamWriter("1234.txt");

            while (a.isZero() == false && p.isOne() == false)
            {
                sw.WriteLine(d + "|" + b.ToString() + "|" + p.ToString() + "|" + a.ToString() + "|" + v.ToString());
                if(b[b.Count - 1] == 1)
                {
                      if(d < 0)
                      {
                          b = b + p;
                          p = b - p;
                          a = a + v;
                          v = a - v;
                          d = -d;
                      }
                      else
                      {
                          b = b + p;
                          a = v + a;
                      }
                }
                b = b / (new cpolinom("1 0", n.mod));
                a = a / (new cpolinom("1 0", n.mod));
                d = d - 1;
            }
            sw.Close();
            return v;    

        }
Пример #7
0
        private void button8_Click(object sender, EventArgs e)
        {
            int p = Convert.ToInt32(textBox5.Text);
            BigInteger N = BigInteger.Parse(textBox4.Text);
            int w = Convert.ToInt32(textBox9.Text);
            int A = Convert.ToInt32(textBox13.Text);
            int B = Convert.ToInt32(textBox14.Text);
            cpolinom c = new cpolinom(textBox6.Text, p);
            cpolinom ir = new cpolinom(textBox8.Text, p);
            List<string> s = new List<string>();            
            listBox4.Items.Clear();

            if (checkedListBox1.CheckedIndices.Count > 0)
            {
                if (checkBox9.Checked == true)
                {
                    for (int i = 0; i < checkedListBox1.CheckedIndices.Count; i++)
                    {
                        int j = checkedListBox1.CheckedIndices[i];
                        List<cpolinom> pols = new List<cpolinom>();
                        pols.Add(ir);
                        pols.Add(c);

                        if (isNaf(j) == true)
                        {
                            for (int k = 0; k < checkedListBox2.CheckedIndices.Count; k++)
                            {
                                int jk = checkedListBox2.CheckedIndices[k];
                                listBox4.Items.Add(PowFuncs[j].name + ", " + InvFuncs[jk].name + ": " + (PowFuncs[j].pow(pols, N, w, A, B, InvFuncs[jk].inv)).ToString());
                            }
                        }
                        else
                            listBox4.Items.Add(PowFuncs[j].name + ": " + (PowFuncs[j].pow(pols, N, w, A, B, InvFuncs[0].inv)).ToString());

                        listBox4.Update();
                    }
                }
                if (checkBox10.Checked == true)
                {
                    for (int i = 0; i < checkedListBox1.CheckedIndices.Count; i++)
                    {
                        int j = checkedListBox1.CheckedIndices[i];
                        List<cpolinom> pols = new List<cpolinom>();
                        pols.Add(ir);
                        pols.Add(c);
                        int count = checkedListBox1.Items.Count;
                        if (isNaf(j) == true)
                        {
                            for (int k = 0; k < checkedListBox2.CheckedIndices.Count; k++)
                            {
                                int jk = checkedListBox2.CheckedIndices[k];
                                listBox4.Items.Add(PowFuncs[j + count].name + ", " + InvFuncs[jk].name + ": " + (PowFuncs[j + count].pow(pols, N, w, A, B, InvFuncs[jk].inv)).ToString());
                            }
                        }
                        else
                            listBox4.Items.Add(PowFuncs[j + count].name + ": " + (PowFuncs[j].pow(pols, N, w, A, B, InvFuncs[0].inv)).ToString());

                        listBox4.Update();
                    }
                }
            }
        }
Пример #8
0
        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                if (listBox2.SelectedIndex < 0) throw new FormatException();
                string s = listBox2.Items[listBox2.SelectedIndex].ToString();
                int p = FindP(s);
                int n = FindN(s);

                Parser pars = new Parser();
                StreamReader sr = new StreamReader("Special Polinoms.txt");
                cpolinom pol = new cpolinom("", p);

                while (sr.EndOfStream == false)
                {
                    string str = sr.ReadLine();
                    pol = pars.ParseString(str);
                    if (pol.mod == p && pol.Count - 1 == n)
                        break;                    
                }
                sr.Close();

                StreamWriter w = new StreamWriter(p.ToString() + "," + n.ToString() + ".txt");
                pol.PrintPolinom(w);
                w.Close();

                System.Windows.Forms.MessageBox.Show("Done");
            }
            catch (FormatException exc) { System.Windows.Forms.MessageBox.Show("Error"); }
            catch (IndexOutOfRangeException exc) { System.Windows.Forms.MessageBox.Show("Error"); }
        }
Пример #9
0
 public static cpolinom meth2_36(cpolinom a, cpolinom b)
 {
     // interface method that wraps computation contained
     // in wlr_comb_mul_arrays() private method
     return new cpolinom(wlr_comb_mul_arrays(a.ToArray(), b.ToArray()), 2);
 }
Пример #10
0
        public static cpolinom operator /(cpolinom a, cpolinom b)
        {
            cpolinom np = new cpolinom("", Math.Max(a.mod, b.mod));
            cpolinom t = Copy(a);

            int m;
            while (t.Count >= b.Count)
            {
                m = Coef(t[0], b[0], t.mod);
                if (m == 0) m = Mod(t[0] / b[0], t.mod);
                for (int i = 0; i < b.Count; i++)
                    t[i] = Mod(t[i] - m * b[i], t.mod);
                t.RemoveAt(0);
                np.Add(m);
            }

            return np;
        }
Пример #11
0
        public static cpolinom operator *(cpolinom a, cpolinom b)
        {
            cpolinom np = new cpolinom("", Math.Max(a.mod, b.mod));
            cpolinom t;

            for (int i = 0; i < a.Count; i++)
                np.Add(a[i] * b[0]);

            for (int i = 1; i < b.Count; i++)
            {
                t = new cpolinom("", Math.Max(a.mod, b.mod));
                for (int j = 0; j < a.Count; j++)
                    t.Add(a[j] * b[i]);
                np.Add(0);
                np = np + t;
            }

            if (np.x.Count == 0)
                np.Insert(0, 0);
            while (np[0] == 0 && np.Count > 1)
                np.RemoveAt(0);

            return np;
        }
Пример #12
0
 public static cpolinom operator -(cpolinom a, cpolinom b)
 {
     cpolinom np = new cpolinom("", Math.Max(a.mod, b.mod));
     while (a.Count < b.Count)
         a.Insert(0, 0);
     while (b.Count < a.Count)
         b.Insert(0, 0);
     for (int i = 0; i < a.Count; i++)
         np.Add(Mod(a[i] - b[i], np.mod));
     return np;
 }
Пример #13
0
        public cpolinom VLSI(cpolinom n)
        {
            cpolinom S = Copy(n);
            cpolinom R = Copy(this);
            int m = S.Count - 1;
            int d = 0;

            cpolinom V = new cpolinom("0", n.mod);
            cpolinom U = new cpolinom("1", n.mod);
            cpolinom x = new cpolinom("1 0", n.mod);

            for(int i = 0; i < 2 * m; i++)
            {
                if (R.Count - 1 < m)
                {
                    R = R * x;
                    U = U * x;
                    d++;
                }
                else
                {
                    if (S.Count - 1 == m)
                    {
                        S = S - R;
                        V = V - U;
                        Fix(U);
                        Fix(S);
                    }
                    S = S * x;
                    if (d == 0)
                    {
                        cpolinom t = Copy(R);
                        R = Copy(S);
                        S = Copy(t);

                        t = Copy(U);
                        U = x * V;
                        V = Copy(t);

                        d++;
                    }
                    else
                    {
                        U = U / x;
                        d--;
                    }
                }                
            }
            return U;
        }
Пример #14
0
        public cpolinom Evk2Polinom(cpolinom n)
        {
            cpolinom S = Copy(n);
            cpolinom R = Copy(this);

            cpolinom V = new cpolinom("0", n.mod);
            cpolinom U = new cpolinom("1", n.mod);

            while (R.Count != 1)
            {
                int d = S.Count - R.Count;
                if (d < 0)
                {
                    cpolinom t = Copy(S);
                    S = Copy(R);
                    R = Copy(t);

                    t = Copy(V);
                    V = Copy(U);
                    U = Copy(t);

                    d = -d;
                }
                cpolinom temp = new cpolinom(d, n.mod);
                S = S - temp * R;
                cpolinom.Fix(S);
                V = V - temp * U;
                cpolinom.Fix(V);                
            }
            return U/R;
        }
Пример #15
0
        public cpolinom meth2_50(cpolinom n)
        {
            cpolinom u = Copy(this);
            cpolinom v = Copy(n);
            cpolinom g1 = new cpolinom("1", n.mod);
            cpolinom g2 = new cpolinom("0", n.mod);
            cpolinom z = new cpolinom("1 0", n.mod);
            int k = 0;

            while (u.isOne() == false && v.isOne() == false)
            {
                Fix(u);
                Fix(v);
                Fix(g1);
                Fix(g2);                

                while ((u % z).isZero() == true)
                {
                    u = u / z;
                    g2 *= z;
                    k++;
                }

                while ((v % z).isZero() == true)
                {
                    v = v / z;
                    g1 *= z;
                    k++;
                }

                if (u.Count > v.Count)
                {
                    u = u + Copy(v);
                    g1 += g2;
                }
                else
                {
                    v = v + Copy(u);
                    g2 += g1;
                }
            }
            cpolinom g;
            if (u.isOne() == true)
                g = g1;
            else
                g = g2;
            Fix(g);

            for (int i = 0; i < k; i++)
            {
                while ((g % z).isZero() == false)
                    g = g + n;
                g /= z;
            }
            return g;
        }
Пример #16
0
        // Функція множення двох поліномів з використанням представлення їх як bigint
        // Напр.: cpolinom С = A.bin_seg(B), де А і В - деякі поліноми, а С - результат множення


        public static cpolinom meth9_6_1(cpolinom a, cpolinom b)
        {
            // Обчислення максимальної кількості біт, яку може займати коефіцієнт полінома-результату(!)
            // (це важливо, тому що для зберігання коефіцієнтів поліномів-множників вистачило б ]log2(p)[ біт,
            // де р - модуль за яким виконуються операції над коефіцієнтами полінома)
            // Формулу див. тут http://www.cs.berkeley.edu/~fateman/papers/polysbyGMP.pdf (стор. 3, абзац 2)
            int boundary = 2 * Math.Max(a.Count, b.Count) * a.x.Max() * b.x.Max();
            // пакування коефіцієнтів, множення, розпакування(див. рядок 50 - конструктор public cpolinom(BigInteger bigint, int boundary, int m))
            // відповідає крокам 2-4 алгоритму 9.6.1
            cpolinom res = new cpolinom(b.pack(boundary) * a.pack(boundary), boundary, a.mod);
            Fix(res);
            return res;
        }
Пример #17
0
 public static cpolinom Copy(cpolinom a)
 {
     cpolinom t = new cpolinom("", a.mod);
     for (int i = 0; i < a.Count; i++)
         t.Add(a[i]);
     return t;
 }
Пример #18
0
        //Algorithm 2.33 Right-to-left shift-and-add field multiplication in F2m
        public static cpolinom meth2_33(cpolinom a, cpolinom b)
        {
            cpolinom c;         
            cpolinom t = Copy(b);

            if (a[a.Count - 1] != 0) c = Copy(t) * (new cpolinom("" + a[a.Count - 1] + "", b.mod));
            else c = new cpolinom("0", b.mod);

            for (int i = a.Count - 2; i > -1; i--)
            {
                t.Add(0);
                if (a[i] != 0) c = c + t * (new cpolinom("" + a[i] + "", b.mod));
            }
            return c;
        }
Пример #19
0
 private static void Fix(cpolinom p)
 {
     while (p[0] == 0 && p.Count != 0)
         p.RemoveAt(0);
     if (p.Count == 0) p.Add(0);
 }
Пример #20
0
        public cpolinom EvkPolinom(cpolinom n)
        {
            cpolinom u = Copy(n);
            cpolinom v = Copy(this);

            cpolinom A = new cpolinom("1", n.mod);
            cpolinom B = new cpolinom("0", n.mod);
            cpolinom C = new cpolinom("0", n.mod);
            cpolinom D = new cpolinom("1", n.mod);

            cpolinom q;
            cpolinom t1;
            cpolinom t2;
            cpolinom t3;

            while (!v.isZero())
            {
                q = u / v;
                t1 = u - (q * v);
                while (t1.Count != 0)
                    if (t1[0] != 0)
                        break;
                    else t1.RemoveAt(0);
                t2 = A - (q * C);
                t3 = B - (q * D);

                u = Copy(v);
                A = Copy(C);
                B = Copy(D);

                v = Copy(t1);
                C = Copy(t2);
                D = Copy(t3);
            }
            if (B.Count == 1 && B[0] != 0)
                B = B / ((B * this) % n);//Якщо результат множення знайденого оберненого на заданний поліном дорівнює числу, то потрібно на це число розділити
            return B;
        }
Пример #21
0
 public bool isEqual(cpolinom p)
 {
     if (this.mod != p.mod)
         return false;
     else if (this.Count != p.Count)
         return false;
     else
     {
         for (int i = 0; i < this.Count; i++)
             if (this[i] != p[i])
                 return false;
         return true;
     }
 }
Пример #22
0
        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                StreamReader r = new StreamReader("temp.txt");
                string s = r.ReadLine();
                r.Close();
                int p = FindP(s);
                int n = FindN(s);
                int count = Convert.ToInt32(textBox3.Text);

                if (listBox1.SelectedIndex < 0 || count < 0) throw new FormatException();

                StreamWriter w = new StreamWriter(p.ToString() + "," + n.ToString() + "," + count.ToString() + ".txt");

                w.WriteLine("[" + listBox1.Items[listBox1.SelectedIndex].ToString() + "]");

                cpolinom c = new cpolinom(listBox1.Items[listBox1.SelectedIndex].ToString(), p);
                cpolinom d;

                for (int i = 0; i < count; i++)
                {
                    d = cpolinom.CreateRand(n, p);
                    if (c > d)
                    {
                        w.WriteLine("");
                        d.PrintPolinom(w);
                    }
                    else i--;
                }
                w.Close();
                System.Windows.Forms.MessageBox.Show("Done");
            }
            catch (FormatException exc) { System.Windows.Forms.MessageBox.Show("Choose polinom"); }
            catch (IndexOutOfRangeException exc) { System.Windows.Forms.MessageBox.Show("Error"); }
        }
Пример #23
0
        /// <summary>
        /// Умножение двух многочленов методом Фурье
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public cpolinom mul_FFT(cpolinom p)
        {
            int N = lengthFFT(Count + p.Count);
            Complex[] a = new Complex[N];
            Complex[] b = new Complex[N];

            //заполним массивы Complex коеффициентами полиномов
            for (int i = 0; i < N; i++)
            {
                a[i] = this[i];
                b[i] = p[i];
            }

            //преобразуем коеффициенты по FFT
            a = FFT.fft(a);
            b = FFT.fft(b);

            //умножим полученные коеффициенты
            for (int i = 0; i < N; i++)
                a[i] *= b[i];

            //проведем обратное преобразование фурье
            a = FFT.ifft(a);

            //создадим полином с новыми коеффициентами
            cpolinom res = new cpolinom(N - 1, mod);
            for (int i = 0; i < N; i++)
            {
                //округлим значения до ближайшего
                try
                {
                    int k = (int)Math.Round(a[i].Real);
                    res[i] = k % mod;
                }
                catch (ArgumentOutOfRangeException e) { }
            }

            //пересчитаем степень полинома
            res.CheckPolinomCount(Zeros(this, p));

            return res;
        }
Пример #24
0
        private void button15_Click(object sender, EventArgs e)
        {
            int p = Convert.ToInt32(textBox5.Text);
            cpolinom c = new cpolinom(textBox6.Text, p);
            cpolinom ir = new cpolinom(textBox8.Text, p);
            List<string> s = new List<string>();
            listBox4.Items.Clear();

            if (checkedListBox2.CheckedIndices.Count > 0)
            {

                for (int i = 0; i < checkedListBox2.CheckedIndices.Count; i++)
                {
                    int j = checkedListBox2.CheckedIndices[i];

                    listBox4.Items.Add(InvFuncs[j].name + ": " + (InvFuncs[j].inv(c, ir).ToString()));

                    listBox4.Update();
                }

            }
        }
Пример #25
0
        public cpolinom Inv2Polinom(cpolinom n)
        {
            cpolinom a = Copy(this);
            cpolinom x = new cpolinom("1 0", n.mod);
            cpolinom y1 = new cpolinom("1", n.mod);

            while (!a.isOne())
            {
                y1 = y1 * x % n;
                a = a * x % n;
            }
            return y1;
        }