public void Simple() { IntX intX = new IntX(-1); Assert.IsTrue(IntX.Pow(intX, 17) == -1); Assert.IsTrue(IntX.Pow(intX, 18) == 1); }
private static int Solution() { return(IntX .Pow(2, 1000) .ToString() .Select(x => x - '0') .Sum()); }
public static DecimalX Calculate(int numberOfDigitsRequired) { int max = numberOfDigitsRequired + 8; // To be safe, compute 8 extra digits, to be dropped at end. The 8 is arbitrary var a = IntX.Multiply(InverseTan(5, max), new IntX(16), MultiplyMode.AutoFht); //16 x arctan(1/5) var b = IntX.Multiply(InverseTan(239, max), new IntX(4), MultiplyMode.AutoFht); //4 x arctan(1/239) IntX pi = a - b; return(new DecimalX( IntX.Divide(pi, IntX.Pow(10, (uint)8), DivideMode.AutoNewton) , IntX.Pow(10, (uint)numberOfDigitsRequired, MultiplyMode.AutoFht))); }
/// <summary> /// This will convert a string into a base-10 number. /// </summary> /// <param name="input">A string that uses our custom base.</param> /// <param name="alphaBase">Custom base alphabet</param> /// <returns>-1 when input was improper. Else, returns the converted number.</returns> public IntX convertFromBase(string input, char[] alphaBase) { #if (SHOW_TIME) Stopwatch sw = new Stopwatch(); sw.Start(); #endif //Convert to base 10 by: (char val at n * base length ^ n-1) //So convert abc into base 10 is 12 * 39 ^ 0 + 11 * 39 ^ 1 + 10 * 39 ^ 2 //Because c is 12, b is 11, a is 10 in our custom base //if (input.Length > 3200) { Console.WriteLine("Input too large!"); return null; } try { IntX x = 0; char[] chars = input.ToCharArray(); Array.Reverse(chars); //We need to reverse the array, so we work from the first digit up int targetBase = alphaBase.Length; uint i = 0; foreach (char c in chars) { if (Array.IndexOf(alphaBase, c) >= 0) { x += Array.IndexOf(alphaBase, c) * (IntX.Pow(targetBase, i)); } i++; } #if (SHOW_TIME) sw.Stop(); Debug.WriteLine("Time elapsed: " + sw.ElapsedMilliseconds + " ms"); #endif return(x); } catch (Exception e) { Console.WriteLine("Uh oh! Something bad happened. " + e.Message); return(null); } }
private void button1_Click(object sender, EventArgs e) { string line; int start, end, x1, x2, pocetni, cilj; pocetni = Int32.Parse(textBox1.Text); cilj = Int32.Parse(textBox2.Text); for (int i = 0; i < 61; i++) //namjestiti inicijalne vrijednosti { brojac[i] = 0; oznacen[i] = 0; tren_tez[i] = 1000; } tren_tez[pocetni] = 0; //tezina pocetnog je nula oznacen[pocetni] = 1; //pocetni je posjecen odmah prethodni[pocetni] = 0; //pocetni nema prethodnog using (System.IO.StreamReader file = new System.IO.StreamReader("tezine.txt")) //citanje iz fajla { while ((line = file.ReadLine()) != null) { start = line.IndexOf("(") + 1; //parsira prvi vrh u zapisu u redu i pamti ga end = line.IndexOf(",", start); string prvi = line.Substring(start, end - start); prvi = prvi.Replace("V", ""); start = line.IndexOf(",") + 1; //drugi end = line.IndexOf(")", start); string drugi = line.Substring(start, end - start); drugi = drugi.Replace("V", ""); x1 = int.Parse(prvi); x2 = int.Parse(drugi); susjedi[x1, brojac[x1]] = x2; //susjed od prvog je drugi susjedi[x2, brojac[x2]] = x1; //susjed od drugog je prvi. Pamti se oba smjera radi lakseg izracuna brojac[x1]++; //brojac broja susjeda brojac[x2]++; veze[x1, x2] = int.Parse(line.Substring(line.LastIndexOf('=') + 1)); //sprema tezinu veze[x2, x1] = veze[x1, x2]; } } bool provjera = true; int tren_vrh = pocetni; //postavljanje pocetnog kao trenutnog vrha int temp_tez, min = 1000, k = 0; while (provjera) { if (prov_oznaceni()) { provjera = false; //funkcija provjerava da li su posjeceni svi vrhovi, ako jesu zavrsava petlju. } else { min = 0; for (int i = 0; i < 61; i++) { if (veze[tren_vrh, susjedi[tren_vrh, i]] != 0) //ako je tezina razlicita od nula, postoji veza izmedu vrhova { temp_tez = tren_tez[tren_vrh] + veze[tren_vrh, susjedi[tren_vrh, i]]; //uzima se ukupna tezina do svakog od susjeda od trenutacnog vrha if (temp_tez < tren_tez[susjedi[tren_vrh, i]]) //ako je manja od dosadanje ukupne tezine do dotičnog vrha, uzima se kao nova { prethodni[susjedi[tren_vrh, i]] = tren_vrh; //tren. vrh se postavlja kao novi prethodni vrh u najkracem putu tren_tez[susjedi[tren_vrh, i]] = temp_tez; } if (tren_tez[susjedi[tren_vrh, i]] < tren_tez[min] && oznacen[susjedi[tren_vrh, i]] == 0) { min = susjedi[tren_vrh, i]; //uzima se sljedeci najmanji susjed } } } oznacen[tren_vrh] = 1; //trenutačni vrh se postavlja da je posjecen if (prov_susjeda(tren_vrh)) //provjerava se posjecenost susjeda tren vrha. Ako su svi posjeceni, vraca se unatrag na prethodni vrh u privremenom putu. { if (k > 0) { k = k - 1; min = tren_put[k]; } } else { tren_put[k] = tren_vrh; //tren vrh se postavlja u privremeni put k++; } tren_vrh = min; //sljedeci vrh je odabrani najmanji susjed } } provjera = true; string ispis = pocetni.ToString(); int[] put = new int[61]; int prebroj = 0; tren_vrh = cilj; //najkraci put do cilja se iscitava od odozada while (provjera) { if (tren_vrh != pocetni) { put[prebroj] = tren_vrh; tren_vrh = prethodni[tren_vrh]; //iscitavaju se prethodni od vrha, i tako od cilja do pocetnog. prebroj++; } else { put[prebroj] = tren_vrh; tren_vrh = prethodni[tren_vrh]; //spremi se i pocetni prebroj++; provjera = false; } } for (int i = prebroj - 2; i >= 0; i--) { ispis += "->" + put[i].ToString(); //put od cilja do pocetnog se obrnuto sprema u ispis } label2.Text = "Put: " + ispis; label4.Text = "Tezina: " + tren_tez[cilj].ToString(); int[] n = new int[60]; uint[] pub = new uint[60]; uint[] priv = new uint[60]; int prebroj2 = 0; using (System.IO.StreamReader file = new System.IO.StreamReader("vrhovi.txt")) { while ((line = file.ReadLine()) != null) { start = line.IndexOf("(") + 1; //čita N iz .txt end = line.IndexOf(","); string brojs = line.Substring(start, end - start); n[prebroj2] = Int32.Parse(brojs); start = line.IndexOf(",") + 1; //čita javni end = line.IndexOf(")"); brojs = line.Substring(start, end - start); pub[prebroj2] = uint.Parse(brojs); start = line.LastIndexOf(",") + 1; //čita privatni end = line.LastIndexOf(")"); brojs = line.Substring(start, end - start); priv[prebroj] = uint.Parse(brojs); prebroj2++; } } listBox1.Items.Clear(); listBox1.Items.Add("Pocetni vrh: " + pocetni.ToString()); if (!File.Exists("ispis.txt")) { File.CreateText("ispis.txt").Close(); } using (StreamWriter sw = File.AppendText("ispis.txt")) { sw.WriteLine("Pocetni vrh: " + pocetni.ToString()); for (int i = prebroj - 2; i >= 0; i--) { IntX enkript = (IntX.Pow(put[i], pub[put[i + 1] - 1]) % n[put[i + 1] - 1]); //enkriptira broj sljedeceg vrha u putu s javnim kljucem trenutacnog listBox1.Items.Add(enkript.ToString()); sw.WriteLine(enkript.ToString()); } sw.WriteLine("Kraj puta"); } MessageBox.Show("Kreirana datoteka ispis.txt"); }
public void Big() { Assert.AreEqual(IntX.Pow(2, 65).ToString(), "36893488147419103232"); }
public void PowOne() { Assert.IsTrue(IntX.Pow(7, 1) == 7); }
public void PowZero() { Assert.IsTrue(IntX.Pow(0, 0) == 1); }
public void Zero() { IntX intX = new IntX(); Assert.IsTrue(IntX.Pow(intX, 77) == 0); }
private void button1_Click(object sender, EventArgs e) { string line; int start, end, brojac = 0; using (System.IO.StreamReader file = new System.IO.StreamReader("put.txt")) { while ((line = file.ReadLine()) != null) //čita kriptirani put i sprema brojke u niz "put" { start = line.IndexOf(".") + 1; end = line.Length; string brojs = line.Substring(start, end - start); brojs = brojs.Replace(" ", ""); put[brojac] = Int32.Parse(brojs); brojac++; } } brojac = 0; using (System.IO.StreamReader file = new System.IO.StreamReader("vrhovi.txt")) //čita i sprema ključeve { while ((line = file.ReadLine()) != null) { start = line.IndexOf("(") + 1; //čita N iz .txt end = line.IndexOf(","); string brojs = line.Substring(start, end - start); n[brojac] = Int32.Parse(brojs); start = line.IndexOf(",") + 1; //čita javni end = line.IndexOf(")"); brojs = line.Substring(start, end - start); pub[brojac] = uint.Parse(brojs); start = line.LastIndexOf(",") + 1; //čita privatni end = line.LastIndexOf(")"); brojs = line.Substring(start, end - start); priv[brojac] = uint.Parse(brojs); brojac++; } } int tren = 1; decPut[0] = "V01"; //početni vrh listBox1.Items.Add("v1"); string temp; for (int i = 0; i < 15; i++) { IntX dekript = (IntX.Pow(put[i], priv[tren - 1]) % n[tren - 1]); //RSA dekripcija sljedeceg u nizu temp = dekript.ToString(); tren = Int32.Parse(temp); if (tren < 10) { decPut[i + 1] = "V0" + tren.ToString(); //provjera da li je vrh manji od 10 samo radi ispisa s nulom ispred } else { decPut[i + 1] = "V" + tren.ToString(); } listBox1.Items.Add("v" + dekript.ToString()); } int suma = 0, tezina; for (int i = 0; i < 14; i++) { using (System.IO.StreamReader file = new System.IO.StreamReader("tezine.txt")) { while ((line = file.ReadLine()) != null) //čita težine { if (line.Contains(decPut[i]) && line.Contains(decPut[i + 1])) //ako linija sadrži trenutačnog i sljedeceg u nizu, uzima njihovu tezinu { tezina = int.Parse(line.Substring(line.LastIndexOf('=') + 1)); suma = suma + tezina; //tezina se pribraja sumi puta } } } } label2.Text = "Tezina: " + suma; //ispis tezine puta }
public IntX Determinant(bool preserve = true) { if (preserve) { return(Copy().Determinant(false)); } if (Width != Height) { throw new ArgumentOutOfRangeException("Is not a square matrix, determinant not defined"); } /* * if (Width == 2 && Height == 2) * return Elements[0, 0] * Elements[1, 1] - Elements[0, 1] * Elements[1, 0]; * if (Width == 1 && Height == 1) * return Elements[0, 0]; * * IntX solution = 0; * MatrixX minorMatrixX = new MatrixX(Width - 1, Height - 1); * for (int i = 0; i < Width; i++) * { * GetMinor(i, 0, ref minorMatrixX); * if (i % 2 == 0) * solution += minorMatrixX.Determinant() * Elements[i, 0]; * else * solution -= minorMatrixX.Determinant() * Elements[i, 0]; * } */ IntX determinantDivisor = 1, deterimant = 1; for (int i = 0; i < Width - 1; i++)//column & row { //find canidate row int m = i; for (; m < Height; m++) { if (Elements[i, m] != 0) { break; } } if (m == Height) { return(0); } //swap canidate with row i if (m != i) { for (int j = 0; j < Width; j++) { IntX a = Elements[j, i], b = Elements[j, m]; Elements[j, i] = b; Elements[m, i] = a; } } if (Elements[i, i] == 0) { throw new ArgumentOutOfRangeException(); } deterimant *= Elements[i, i]; //multiply and add to all other rows after i for (int j = i + 1; j < Height; j++)//row { // Finding scalar multiple IntX canidateMult = Elements[i, j]; for (int k = i; k < Width; k++)//column { // Column is k // Canidate row is i // Current row is j // Scalar multiplier for current row is Elements[i,i] // Scalar multiplier for subtraction canidate row is canidateMult (initially Elements[i,j]) Elements[k, j] = Elements[k, j] * Elements[i, i] - Elements[k, i] * canidateMult; } } // Find total divisor. determinantDivisor *= IntX.Pow(Elements[i, i], (uint)(Height - i - 1)); } return(IntX.Divide(deterimant * Elements[Width - 1, Height - 1], determinantDivisor, DivideMode.Classic)); }
public static Object Solve() { return(IntX.Pow(2, power).ToString().ToCharArray().Sum(x => Int32.Parse(x.ToString()))); }