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; }
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; }
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; }
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; }
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; }
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; }
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(); } } } }
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"); } }
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); }
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; }
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; }
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; }
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; }
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; }
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; }
// Функція множення двох поліномів з використанням представлення їх як 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; }
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; }
//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; }
private static void Fix(cpolinom p) { while (p[0] == 0 && p.Count != 0) p.RemoveAt(0); if (p.Count == 0) p.Add(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; }
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; } }
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"); } }
/// <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; }
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(); } } }
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; }