Miller-Rabin prímteszt

Üdvözlöm, Ön a Miller-Rabin prímteszt szó jelentését keresi. A DICTIOUS-ban nem csak a Miller-Rabin prímteszt szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a Miller-Rabin prímteszt szót egyes és többes számban mondani. Minden, amit a Miller-Rabin prímteszt szóról tudni kell, itt található. A Miller-Rabin prímteszt szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. AMiller-Rabin prímteszt és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Kiejtés

  • IPA:

Főnév

Miller-Rabin prímteszt

  1. (matematika, algoritmusok)

Miller-Rabin prímteszt

A Miller-Rabin prímteszt egy véletlenített algoritmus, amely nagy számok prímtesztelésére szolgál. Ez az algoritmus a Fermat-teszt kiterjesztése, amelyet a prímek pontosabb ellenőrzésére terveztek, és képes az összetett számok kiszűrésére nagy hatékonysággal.



Algoritmus célja

Adott egy (n > 2) egész szám, a cél annak meghatározása, hogy (n): - Valószínűsíthetően prím (lehetséges prím), - vagy biztosan összetett.



Matematikai alapok

A Miller-Rabin algoritmus a következő tételekre épít:

  1. Fermat kis tétele:
    • Ha (n) prím és (a) egy (1 < a < n-1) egész szám, akkor:
  2. Oszthatósági szabályok és faktorizáció:
    • (n-1 = 2^s d), ahol (d) páratlan.
  3. Tanúk és hamis tanúk:
    • Egy szám (a) tanúként viselkedik, ha igazolja, hogy (n) összetett.



Algoritmus lépései

  1. Formáld meg (n-1)-et:
    • Írd fel (n-1 = 2^s d), ahol (d) páratlan.
  2. Véletlen alapszám választása:
    • Válassz egy véletlen (a) számot a (2 a n-2) tartományból.
  3. Számítások:
    • Számítsd ki:
    • Ha (x = 1) vagy (x = n-1), akkor (a) nem bizonyítja (n) összetettségét.
  4. Ismételt négyzetek ellenőrzése:
    • Iteratívan számítsd ki (x = x^2 n), legfeljebb (s-1) alkalommal:
      • Ha (x = n-1), akkor (a) nem bizonyítja (n) összetettségét.
      • Ha (x = 1), akkor (n) biztosan összetett.
  5. Többszöri ellenőrzés:
    • Ismételd meg a fenti lépéseket több véletlen (a)-ra.
    • Ha egyetlen (a) is bizonyítja, hogy (n) összetett, akkor (n) biztosan nem prím.
    • Ha több teszt sem bizonyítja (n) összetettségét, akkor (n) valószínűleg prím.



Pszeudokód

MillerRabin(n, k):
    Írd fel n-1 = 2^s * d alakban
    ismételd k alkalommal:
        Válassz véletlen a számot  tartományból
        x = a^d mod n
        ha x == 1 vagy x == n-1:
            folytasd a következő iterációval
        ismételd (s-1) alkalommal:
            x = x^2 mod n
            ha x == n-1:
                folytasd a következő iterációval
        ha egyik feltétel sem teljesült:
            n biztosan összetett
    n valószínűleg prím

Python implementáció

import random

def miller_rabin(n, k=5):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0:
        return False

    # Írd fel n-1 = 2^s * d alakban
    s, d = 0, n - 1
    while d % 2 == 0:
        s += 1
        d //= 2

    def is_composite(a):
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            return False
        for _ in range(s - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                return False
        return True

    # Véletlen tesztek
    for _ in range(k):
        a = random.randint(2, n - 2)
        if is_composite(a):
            return False

    return True

# Példa használat
n = 561  # Összetett szám
print(f"A {n} szám prím? {'Igen' if miller_rabin(n) else 'Nem'}")

Kimenet:

A 561 szám prím? Nem

C++ implementáció

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

bool miller_rabin(long long n, int k = 5) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0) return false;

    // Írd fel n-1 = 2^s * d alakban
    long long d = n - 1;
    int s = 0;
    while (d % 2 == 0) {
        d /= 2;
        s++;
    }

    auto is_composite = (long long a) {
        long long x = pow(a, d) - (long long)(pow(a, d) / n) * n;
        if (x == 1 || x == n - 1) return false;
        for (int r = 1; r < s; ++r) {
            x = (x * x) % n;
            if (x == n - 1) return false;
        }
        return true;
    };

    // Véletlen tesztek
    for (int i = 0; i < k; ++i) {
        long long a = 2 + rand() % (n - 3);
        if (is_composite(a)) return false;
    }

    return true;
}

int main() {
    long long n = 561;  // Összetett szám
    cout << "A " << n << " szám prím? " << (miller_rabin(n) ? "Igen" : "Nem") << endl;
    return 0;
}

Kimenet:

A 561 szám prím? Nem

Előnyök

  1. Hatékonyság:
    • Nagy számokra is gyors.
  2. Egyszerű implementáció:
    • Könnyen programozható.
  3. Alkalmazkodóképesség:
    • A hibavalószínűség a tesztek számának növelésével tetszőlegesen csökkenthető.



Hátrányok

  1. Véletlenített algoritmus:
    • Nem determinisztikus; nagy számok esetén „valószínűsíti” a prím tulajdonságot.
  2. Különleges számok:
    • Bizonyos számoknál hibás eredményt adhat, ha nem megfelelő teszteseteket választanak.



Alkalmazások

  1. Kriptográfia:
    • Prímszámok generálása RSA kulcspárok előállításához.
  2. Matematikai kutatás:
    • Nagy prímek keresése.
  3. Tudományos számítások:
    • Számelméleti problémák megoldása.



Összegzés

A Miller-Rabin prímteszt egy hatékony és széles körben alkalmazott algoritmus, amely nagy számok gyors prímtesztelését teszi lehetővé. Bár nem determinisztikus, a gyakorlatban rendkívül megbízható, ezért elengedhetetlen eszköz a modern kriptográfiában és matematikai alkalmazásokban.

Fordítások