Esempio n. 1
0
        public void Simple()
        {
            IntX intX = new IntX(-1);

            Assert.IsTrue(IntX.Pow(intX, 17) == -1);
            Assert.IsTrue(IntX.Pow(intX, 18) == 1);
        }
Esempio n. 2
0
 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)));
    }
Esempio n. 4
0
        /// <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");
        }
Esempio n. 6
0
 public void Big()
 {
     Assert.AreEqual(IntX.Pow(2, 65).ToString(), "36893488147419103232");
 }
Esempio n. 7
0
 public void PowOne()
 {
     Assert.IsTrue(IntX.Pow(7, 1) == 7);
 }
Esempio n. 8
0
 public void PowZero()
 {
     Assert.IsTrue(IntX.Pow(0, 0) == 1);
 }
Esempio n. 9
0
        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
        }
Esempio n. 11
0
        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));
        }
Esempio n. 12
0
 public static Object Solve()
 {
     return(IntX.Pow(2, power).ToString().ToCharArray().Sum(x => Int32.Parse(x.ToString())));
 }