Keresés

Új hozzászólás Aktív témák

  • ArchElf

    addikt

    válasz ArchElf #894 üzenetére

    folyt.
    prímszámítás kommentezve:

    private static bool isPrimeWithCountNew(Int64 szam)
    {
    Console.WriteLine("Osztoi:");

    // Lista az osztók tárolására
    List<long> osztok = new List<long>();
    int result_x;

    // Ha nem nyilvántartott prímszám akkor elkezdjük keresni
    if ((result_x=GetPBit(szam)) != 1)
    {
    // keresési érték = kezdőérték
    // elsőször egyenlő a számmal
    long bc = szam;

    // prím keresés első lépésének inicializálása
    Int64 ix = 2;

    // Addig iterálunk, míg minden gyököt meg nem találunk,
    // vagy a sor végére nem érünk
    while (true)
    {
    // amennyiben a keresési érték prímszám eltároljuk és kilépünk a ciklusból
    // ez nem lehet az eredetileg keresett szám,
    // mert akkor az előző feltételnél nem jutottunk volna be ide
    if (GetPBit(bc) == 1)
    {
    osztok.Add(bc);
    break;
    }
    // a négyzetgyökének veszzük a keresési kezdőértéknek
    // kezdeti eseben az első iteráció a kezdeti szám négyzetéig keres
    // ha eddig nincs találat a szám prímszám és > UInt32
    long sq = (long)Math.Floor(Math.Sqrt(bc));

    // ha a keresési kezdőérték prím és a négyzete kiadja a
    // a keresett keresési kezdőértéket
    // kétszer berakjuk a listába és kilépünk a ciklusból
    if ((sq * sq == bc) && (GetPBit(sq) == 1))
    {
    osztok.Add(sq);
    osztok.Add(sq);
    break;
    }

    // osztási sort elkezdjük, addig megyünk,
    // amíg a négyzetgyököt el nem érjük
    bool mul = false;
    while (ix <= sq)
    {
    int result;
    // amennyiben az ix (keresési lépés) prímszám,
    // megpróbálunk osztani vele
    if ((result = GetPBit(ix)) == 1)
    {
    // ha sikerül az osztás maradék nélkül,
    // a keresési kezdőértéket elosztjuk a
    // keresési lépéssel és újrakezdjük külső ciklust
    // a találta osztót a listához adjuk
    // megjelöljük, hogy volt sikeres osztás
    if (bc % ix == 0)
    {
    bc /= ix;
    mul = true;
    osztok.Add(ix);
    break;
    }
    }
    // amennyiben az keresőszámhoz tartozó tartományban (8 szám - 1 byte)
    // nincs prím, úgy előre lépünk 8-at
    if (result == -1)
    ix = (((ix >> 3) + 1) << 3);
    // minden más esetben növeljük a keresőszámot 1-el
    else
    ix++;
    }
    // ha nem találtunk osztót
    if (!mul)
    {
    // ha a keresőszám != a keresett számmal,
    // akkor a keresőszám > UInt32 és prím
    // hozzáadjuk a listához
    if (bc != szam)
    osztok.Add(bc);
    // kilépünk a külső ciklusból
    break;
    }
    }
    }
    if (osztok.Count == 0)
    {
    Console.WriteLine("nincsenek");
    return true;
    }
    else
    {
    Console.WriteLine("{0} prímtényezőre osztható, melyek a következők:", osztok.Count);
    foreach (long l in osztok)
    Console.Write("{0} ", l);
    Console.WriteLine();
    return false;
    }
    }
    }

    Csinálok egy adag popcornt, és leülök fórumozni --- Ízlések és pofonok - kinek miből jutott --- Az igazi beköpőlégy [http://is.gd/cJvlC2]

Új hozzászólás Aktív témák