示例#1
0
        public void TrefferBestimmenGrobTest()
        {
            int n = 499 * 41;

            List <Zyklus> result = FermatExtended.TrefferBestimmen(n, new int[] { 10 });

            List <FermatExtended.MddPaarImZahlensystem> paare = FermatExtended.mdPaareBestimmen(n, new int[] { 10 });

            List <Tuple <int, int, int> > vergleichsliste = new List <Tuple <int, int, int> >();

            int m = (int)Math.Sqrt(n) + 1;

            FermatExtended.MddPaarImZahlensystem aktuellesPaar = paare[0];
            for (int i = 0; i < (aktuellesPaar.Zahlensystem); i++)
            {
                int dd = m * m - n;
                if (aktuellesPaar.MddPaar.Exists(x => ((x.Item1 == m % aktuellesPaar.Zahlensystem) && (x.Item2 == dd % aktuellesPaar.Zahlensystem))))
                {
                    vergleichsliste.Add(new Tuple <int, int, int>(m % aktuellesPaar.Zahlensystem, dd % aktuellesPaar.Zahlensystem, i));
                }

                m++;
            }
            vergleichsliste.Add(new Tuple <int, int, int>(0, 0, aktuellesPaar.Zahlensystem + vergleichsliste[0].Item3));

            Zyklus aktuellerZyklus = result[0];

            for (int i = 0; i < aktuellerZyklus.NumberOfElements; i++)
            {
                Assert.IsTrue(vergleichsliste[i].Item3 == aktuellerZyklus.Elemente[i]);
            }
        }
示例#2
0
        private FermatExtended.MddPaarImZahlensystem BerechneMDInternal(int n, int zahlensystem)
        {
            int m;
            int d1;
            int d2;
            int dd;

            //int potenz = zahlensystem * zahlensystem;

            FermatExtended.MddPaarImZahlensystem mddPaareImZahlensystem = new FermatExtended.MddPaarImZahlensystem(zahlensystem);

            List <Tuple <int, int> > endungen = FermatExtended.EndungenBestimmen(n, zahlensystem);

            foreach (Tuple <int, int> endung in endungen)
            {
                // aller Wahrscheinlichkeit nach reichen zwei Überprüfungen
                // 0*10**1+X+Y
                // 1*10**1+X+Y
                for (int i = 0; i < zahlensystem; i++)
                {
                    for (int j = 0; j < zahlensystem; j++)
                    {
                        m  = ((((i * zahlensystem) + endung.Item1) + ((j * zahlensystem) + endung.Item2)) / 2) % zahlensystem;
                        d1 = ((((i * zahlensystem) + endung.Item1) - ((j * zahlensystem) + endung.Item2)) / 2) % zahlensystem;
                        d2 = ((((i * zahlensystem) + endung.Item2) - ((j * zahlensystem) + endung.Item1)) / 2) % zahlensystem;

                        if (d1 < 0)
                        {
                            d1 += zahlensystem;
                        }

                        if (d2 < 0)
                        {
                            d2 += zahlensystem;
                        }


                        // pruefen, ob "m" eine Ganzzahl geblieben ist, sonst kann das Ergebnis verworfen werden
                        if (((2 * m) % zahlensystem) == (((i * zahlensystem) + endung.Item1) + ((j * zahlensystem) + endung.Item2)) % zahlensystem)
                        {
                            dd = (d1 * d1) % zahlensystem;
                            if (!mddPaareImZahlensystem.MddPaar.Exists(x => x.Item1 == m && x.Item2 == dd))
                            {
                                mddPaareImZahlensystem.MddPaar.Add(new Tuple <int, int>(m, dd));
                            }

                            dd = (d2 * d2) % zahlensystem;
                            if (!mddPaareImZahlensystem.MddPaar.Exists(x => x.Item1 == m && x.Item2 == dd))
                            {
                                mddPaareImZahlensystem.MddPaar.Add(new Tuple <int, int>(m, dd));
                            }
                        }
                    }
                }
            }

            return(mddPaareImZahlensystem);
        }
示例#3
0
        public void mdPaareBestimmenTest()
        {
            int zahlensystem = 10;
            int n            = 43 * 971;

            List <FermatExtended.MddPaarImZahlensystem> actual = FermatExtended.mdPaareBestimmen(n, new int[] { zahlensystem });

            FermatExtended.MddPaarImZahlensystem expected = this.BerechneMDInternal(n, zahlensystem);


            Assert.IsTrue(actual[0].MddPaar.Count == expected.MddPaar.Count);

            for (int i = 0; i < expected.MddPaar.Count; i++)
            {
                Assert.IsTrue(actual[0].MddPaar.Exists(x => ((x.Item1 == expected.MddPaar[i].Item1) && (x.Item2 == expected.MddPaar[i].Item2))));
            }
        }