public static Polynom operator *(Polynom A, double number) { // умножение на число Polynom B = new Polynom(A.polynomCoefs.Length); for (int i = 0; i < B.polynomCoefs.Length; i++) { B.polynomCoefs[i] = A.polynomCoefs[i] * number; } return B; }
public static Polynom operator ^(Polynom A, int power) { // пох что оператор ^ должен делать XOR, тут это возведение в степень Polynom B; B = new Polynom(1); B.polynomCoefs[0] = 1; for (int i = 0; i < power; i++) { B = B * A; } return(B); }
public static Polynom operator *(Polynom A, Polynom B) { // умножение int maxResultLength = (A.polynomCoefs.Length - 1) + (B.polynomCoefs.Length - 1) + 1; Polynom C = new Polynom(maxResultLength); for (int i = 0; i < A.polynomCoefs.Length; i++) { for (int k = 0; k < B.polynomCoefs.Length; k++) { C.polynomCoefs[i + k] += A.polynomCoefs[i] * B.polynomCoefs[k]; } } return C; }
public static Polynom operator *(Polynom A, Polynom B) { // умножение int maxResultLength = (A.polynomCoefs.Length - 1) + (B.polynomCoefs.Length - 1) + 1; Polynom C = new Polynom(maxResultLength); for (int i = 0; i < A.polynomCoefs.Length; i++) { for (int k = 0; k < B.polynomCoefs.Length; k++) { C.polynomCoefs[i + k] += A.polynomCoefs[i] * B.polynomCoefs[k]; } } return(C); }
public static void BruteDecomposition(Polynom pol, int maxCoef) { int maxPow = pol.polynomCoefs.Length; Stopwatch timer = new Stopwatch(); int attempts = 0; Console.WriteLine("----------------------------------------------"); Console.WriteLine("trying to decompose polynome: " + pol); Console.WriteLine("----------------------------------------------"); Console.WriteLine("maxCoef: " + maxCoef); Console.WriteLine("maxPow: " + maxPow); Console.WriteLine("----------------------------------------------"); Console.WriteLine("+++++++"); for (int i = 2; i <= maxPow; i++) { int length1 = i; int length2 = maxPow - i + 2; // timer.Start(); for (int k1 = 1; k1 < Math.Pow(maxCoef, length1); k1++) { for (int k2 = 1; k2 < Math.Pow(maxCoef, length2); k2++) { attempts++; Polynom pol1 = new Polynom(k1, maxCoef); Polynom pol2 = new Polynom(k2, maxCoef); if (pol == pol1.Composition(pol2)) { Console.WriteLine("p1: " + pol1); Console.WriteLine("p2: " + pol2); Console.WriteLine("+++++++"); } } } } timer.Stop(); Console.WriteLine("Attempts: " + attempts); Console.WriteLine("Total time: " + Math.Round((double)timer.ElapsedMilliseconds / 1000, 2) + " sec"); }
public static void BruteDecomposition(Polynom pol, int maxCoef) { int maxPow = pol.polynomCoefs.Length; Stopwatch timer = new Stopwatch(); int attempts = 0; Console.WriteLine("----------------------------------------------"); Console.WriteLine("trying to decompose polynome: " + pol); Console.WriteLine("----------------------------------------------"); Console.WriteLine("maxCoef: " + maxCoef); Console.WriteLine("maxPow: " + maxPow); Console.WriteLine("----------------------------------------------"); Console.WriteLine("+++++++"); for (int i = 2; i <= maxPow; i++) { int length1 = i; int length2 = maxPow - i + 2; // timer.Start(); for (int k1 = 1; k1 < Math.Pow(maxCoef, length1); k1++) { for (int k2 = 1; k2 < Math.Pow(maxCoef, length2); k2++) { attempts++; Polynom pol1 = new Polynom(k1, maxCoef); Polynom pol2 = new Polynom(k2, maxCoef); if (pol == pol1.Composition(pol2)) { Console.WriteLine("p1: " + pol1); Console.WriteLine("p2: " + pol2); Console.WriteLine("+++++++"); } } } } timer.Stop(); Console.WriteLine("Attempts: " + attempts); Console.WriteLine("Total time: " + Math.Round((double)timer.ElapsedMilliseconds/1000, 2) + " sec"); }
public static Polynom operator +(Polynom A, Polynom B) { // сложение if (B.polynomCoefs.Length > A.polynomCoefs.Length) { Polynom tmp = A; A = B; B = tmp; } Polynom C = new Polynom(A.polynomCoefs.Length); for (int i = 0; i < C.polynomCoefs.Length; i++) { if (i < B.polynomCoefs.Length) { C.polynomCoefs[i] = A.polynomCoefs[i] + B.polynomCoefs[i]; } else { C.polynomCoefs[i] = A.polynomCoefs[i]; } } return(C); }
static void Main(string[] args) { //тестовые значения int a = 257; int b = 18; int nRoots = 1; int nBase; int xr; Polynom sx; // если есть входные аргументы, юзаем их if (args.Length != 0) { a = Convert.ToInt32(args[0]); b = Convert.ToInt32(args[1]); nRoots = Convert.ToInt32(args[2]); } else { Console.WriteLine("no arguments passed, using test values..."); } // генерим полином и закрытый ключ int sqrt = Convert.ToInt32(Math.Floor(Math.Pow(a < b ? a : b, (double)1 / nRoots))); Random rnd = new Random(); sqrt = rnd.Next(2, sqrt + 1); nBase = Convert.ToInt32(Math.Pow(sqrt, nRoots)); int n = rnd.Next(1, 10); // хз какой диапазон брать xr = sqrt - n; sx = (new Polynom(new double[] { n, 1 })) ^ nRoots; // преобразумем числа в полиномы Polynom p1 = new Polynom(a, nBase); Polynom p2 = new Polynom(b, nBase); // композиция с S(x) Polynom c1 = p1.Composition(sx); Polynom c2 = p2.Composition(sx); // результат деления Polynom[] divP = (p1 / p2); Polynom[] divC = (c1 / c2); // вывод в консоль Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1: " + p1); Console.WriteLine("p2: " + p2); Console.WriteLine("s(x): " + sx); Console.WriteLine("nBase: " + nBase); Console.WriteLine("xr: " + xr); Console.WriteLine("----------------------------------------------"); Console.WriteLine("c1: " + c1); Console.WriteLine("c2: " + c2); Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1 + p2: " + (p1 + p2)); Console.WriteLine("(p1 + p2)(nBase): " + (p1 + p2).Value(nBase)); Console.WriteLine("c1 + c2: " + (c1 + c2)); Console.WriteLine("(c1 + c2)(xr): " + (c1 + c2).Value(xr)); Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1 * p2: " + (p1 * p2)); Console.WriteLine("(p1 * p2)(nBase): " + (p1 * p2).Value(nBase)); Console.WriteLine("c1 * c2: " + (c1 * c2)); Console.WriteLine("(c1 * c2)(xr): " + (c1 * c2).Value(xr)); Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1 / p2: " + divP[0]); Console.WriteLine("remainder:\t" + divP[1]); Console.WriteLine("(p1 / p2)(nBase): " + Math.Round(divP[0].Value(nBase), 2)); Console.WriteLine("remainder:\t" + Math.Round(divP[1].Value(nBase), 2) + "/" + b); Console.WriteLine("c1 / c2: " + divC[0]); Console.WriteLine("remainder:\t" + divC[1]); Console.WriteLine("(c1 / c2)(xr): " + Math.Round(divC[0].Value(xr), 2)); Console.WriteLine("remainder:\t" + Math.Round(divC[1].Value(xr), 2) + "/" + b); Console.WriteLine("----------------------------------------------"); BruteDecomposition(c1, nBase); Console.ReadKey(); }
public static Polynom operator +(Polynom A, Polynom B) { // сложение if(B.polynomCoefs.Length > A.polynomCoefs.Length) { Polynom tmp = A; A = B; B = tmp; } Polynom C = new Polynom(A.polynomCoefs.Length); for (int i = 0; i < C.polynomCoefs.Length; i++) { if(i < B.polynomCoefs.Length) { C.polynomCoefs[i] = A.polynomCoefs[i] + B.polynomCoefs[i]; } else { C.polynomCoefs[i] = A.polynomCoefs[i]; } } return C; }
public Polynom Composition(Polynom p2) { // вычисление композиции Polynom resultPolynom = new Polynom((p2.polynomCoefs.Length - 1) * (this.polynomCoefs.Length - 1) + 1); for (int i = 0; i < this.polynomCoefs.Length; i++) { resultPolynom += (p2 ^ i) * this.polynomCoefs[i]; } return resultPolynom; }
public static Polynom operator ^(Polynom A, int power) { // пох что оператор ^ должен делать XOR, тут это возведение в степень Polynom B; B = new Polynom(1); B.polynomCoefs[0] = 1; for (int i = 0; i < power; i++ ) { B = B * A; } return B; }
public static Polynom[] operator /(Polynom A, Polynom B) { // деление // возвращает массив из результата и остатка //хрень короче, можно проще сделать (наверно) Polynom tmpA = new Polynom((double[]) A.polynomCoefs.Clone()); int lengthA = A.polynomCoefs.Length; int highCoefA = A.polynomCoefs.Length - 1; int highCoefB = B.polynomCoefs.Length - 1; Polynom[] C = new Polynom[2]; C[0] = new Polynom(highCoefA - highCoefB + 1); while(highCoefA >= highCoefB) { if (tmpA.polynomCoefs[highCoefA] != 0) { double coef = tmpA.polynomCoefs[highCoefA] / B.polynomCoefs[highCoefB]; int exp = highCoefA - highCoefB; Polynom tmp = new Polynom(new double[lengthA]); tmp.polynomCoefs[exp] = coef; C[0] += tmp; tmp = tmp * B; tmpA -= tmp; } highCoefA -= 1; } C[1] = tmpA; return C; }
public static Polynom operator -(Polynom A, Polynom B) { // вычитание //лень нормально делать for (int i = 0; i < B.polynomCoefs.Length; i++) { B.polynomCoefs[i] = -B.polynomCoefs[i]; } if (B.polynomCoefs.Length > A.polynomCoefs.Length) { Polynom tmp = A; A = B; B = tmp; } Polynom C = new Polynom(A.polynomCoefs.Length); for (int i = 0; i < C.polynomCoefs.Length; i++) { if (i < B.polynomCoefs.Length) { C.polynomCoefs[i] = A.polynomCoefs[i] + B.polynomCoefs[i]; } else { C.polynomCoefs[i] = A.polynomCoefs[i]; } } return C; }
static void Main(string[] args) { //тестовые значения int a = 257; int b = 18; int nRoots = 1; int nBase; int xr; Polynom sx; // если есть входные аргументы, юзаем их if(args.Length !=0) { a = Convert.ToInt32(args[0]); b = Convert.ToInt32(args[1]); nRoots = Convert.ToInt32(args[2]); } else { Console.WriteLine("no arguments passed, using test values..."); } // генерим полином и закрытый ключ int sqrt = Convert.ToInt32(Math.Floor(Math.Pow(a < b ? a : b, (double)1 / nRoots))); Random rnd = new Random(); sqrt = rnd.Next(2, sqrt + 1); nBase = Convert.ToInt32(Math.Pow(sqrt, nRoots)); int n = rnd.Next(1, 10); // хз какой диапазон брать xr = sqrt - n; sx = (new Polynom(new double[] { n, 1 })) ^ nRoots; // преобразумем числа в полиномы Polynom p1 = new Polynom(a, nBase); Polynom p2 = new Polynom(b, nBase); // композиция с S(x) Polynom c1 = p1.Composition(sx); Polynom c2 = p2.Composition(sx); // результат деления Polynom[] divP = (p1 / p2); Polynom[] divC = (c1 / c2); // вывод в консоль Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1: " + p1); Console.WriteLine("p2: " + p2); Console.WriteLine("s(x): " + sx); Console.WriteLine("nBase: " + nBase); Console.WriteLine("xr: " + xr); Console.WriteLine("----------------------------------------------"); Console.WriteLine("c1: " + c1); Console.WriteLine("c2: " + c2); Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1 + p2: " + (p1 + p2)); Console.WriteLine("(p1 + p2)(nBase): " + (p1 + p2).Value(nBase)); Console.WriteLine("c1 + c2: " + (c1 + c2)); Console.WriteLine("(c1 + c2)(xr): " + (c1 + c2).Value(xr)); Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1 * p2: " + (p1 * p2)); Console.WriteLine("(p1 * p2)(nBase): " + (p1 * p2).Value(nBase)); Console.WriteLine("c1 * c2: " + (c1 * c2)); Console.WriteLine("(c1 * c2)(xr): " + (c1 * c2).Value(xr)); Console.WriteLine("----------------------------------------------"); Console.WriteLine("p1 / p2: " + divP[0]); Console.WriteLine("remainder:\t" + divP[1]); Console.WriteLine("(p1 / p2)(nBase): " +Math.Round( divP[0].Value(nBase),2)); Console.WriteLine("remainder:\t" + Math.Round(divP[1].Value(nBase), 2) + "/" + b); Console.WriteLine("c1 / c2: " + divC[0]); Console.WriteLine("remainder:\t" + divC[1]); Console.WriteLine("(c1 / c2)(xr): " + Math.Round(divC[0].Value(xr),2)); Console.WriteLine("remainder:\t" + Math.Round(divC[1].Value(xr),2) + "/" + b); Console.WriteLine("----------------------------------------------"); BruteDecomposition(c1,nBase); Console.ReadKey(); }