Kiejtés

  • IPA: [ ˈpriːmtɛst]

Főnév

prímteszt

  1. (matematika, algoritmusok, számelmélet) Prímteszten a matematikában vagy informatikában olyan (determinisztikus) algoritmust vagy indeterminisztikus (például valószínűség-elméleti) módszereket is megengedő eljárást értünk, melynek ismeretében bármely adott egész számról, vagy csak bizonyos típusú számokról (véges sok lépésben) el tudjuk dönteni, hogy prímszám-e, vagy pedig összetett. Ettől lényegesen különböző és sokkal nehezebb feladat egy adott szám prímtényezőinek a megtalálása (prímfelbontás).

Prímteszt

A prímteszt algoritmusok célja annak eldöntése, hogy egy adott szám prímszám-e. Egy szám prím, ha nagyobb, mint (1), és csak (1) és önmaga osztói vannak. A prímtesztek számos típusúak lehetnek, a legegyszerűbb iteratív osztásos módszertől kezdve a bonyolultabb probabilisztikus és determinisztikus algoritmusokig.



Algoritmusok

1. Egyszerű iteratív osztásos prímteszt

A legegyszerűbb módszer, amely egy szám oszthatóságát vizsgálja.

Lépések: 1. Ha a szám kisebb, mint 2, akkor nem prím. 2. Ellenőrizd, hogy osztható-e (2)-vel. 3. Ellenőrizd a (3)-tól ()-ig tartó számokkal való oszthatóságot.

Időbonyolultság: (O())

Python implementáció:

def is_prime_simple(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

# Példa
print(is_prime_simple(29))  # True
print(is_prime_simple(30))  # False

2. Eratoszthenész szitája

Egy hatékony algoritmus az összes prím meghatározására (1) és egy adott (n) között.

Lépések: 1. Hozz létre egy logikai listát az (1)-től (n)-ig terjedő számokról. 2. Jelöld ki a (2)-t mint prím. 3. Szorzataik kizárásával (nem prímszámként megjelölésével) iteratívan haladj.

Időbonyolultság: (O(n n))

Python implementáció:

def sieve_of_eratosthenes(limit):
    primes = [True] * (limit + 1)
    primes[0] = primes[1] = False
    for i in range(2, int(limit ** 0.5) + 1):
        if primes[i]:
            for j in range(i * i, limit + 1, i):
                primes[j] = False
    return [i for i, is_prime in enumerate(primes) if is_prime]

# Példa
print(sieve_of_eratosthenes(30))  # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

3. Miller-Rabin prímteszt

Egy probabilisztikus prímteszt, amely megvizsgálja, hogy egy szám valószínűleg prím-e. Nagy számok esetén hatékony.

Lépések: 1. Írd fel (n-1 = 2^r d) alakban ((d) páratlan). 2. Véletlenszerűen válassz egy (a)-t ((2 a n-2)). 3. Ellenőrizd, hogy (a^d n = 1), vagy ((a{2j d} n = n-1)) valamelyik (0 j < r)-re. 4. Ismételd meg a tesztet néhány különböző (a)-val.

Időbonyolultság: (O(k ^3 n)), ahol (k) az ismétlések száma.

Python implementáció:

import random

def miller_rabin(n, k=5):  # k az ismétlések száma
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0:
        return False

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

    for _ in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, d, n)  # a^d % n
        if x == 1 or x == n - 1:
            continue
        for _ in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            return False
    return True

# Példa
print(miller_rabin(29))  # True
print(miller_rabin(30))  # False

4. AKS prímteszt

Egy determinisztikus algoritmus, amely bizonyítja, hogy egy szám prím-e. Az AKS prímteszt polinomiális időben fut, de implementációja és futási ideje miatt ritkán használják.

Időbonyolultság: (O(^6 n))



Összehasonlítás

Algoritmus Időbonyolultság Előnyök Hátrányok
Iteratív osztásos teszt (O()) Egyszerű, könnyen érthető Lassú nagy számoknál
Eratoszthenész szitája (O(n n)) Hatékony prímek generálására Sok memóriát igényel nagy (n)-re
Miller-Rabin teszt (O(k ^3 n)) Gyors, nagy számokra alkalmas Probabilisztikus
AKS prímteszt (O(^6 n)) Determinisztikus Nehéz implementáció, lassú



Példák

Iteratív teszt:

print(is_prime_simple(97))  # True

Eratoszthenész szitája:

print(sieve_of_eratosthenes(100))  # [2, 3, 5, 7, 11, 13, ..., 97]

Miller-Rabin teszt:

print(miller_rabin(561))  # False, mert 561 kompozit (Carmichael-szám)

Összegzés

A választott prímteszt algoritmus a probléma méretétől és jellegétől függ: - Kisebb számok: Iteratív osztásos teszt vagy Eratoszthenész szitája. - Nagy számok: Miller-Rabin teszt. - Bizonyított prímekhez: Determinisztikus algoritmusok, például AKS.

Ezek az algoritmusok fontosak kriptográfiában, számelméletben és adatelemzésben.

Fordítások