Prímfelbontás

Ez a szócikk nem tünteti fel a független forrásokat, amelyeket felhasználtak a készítése során. Emiatt nem tudjuk közvetlenül ellenőrizni, hogy a szócikkben szereplő állítások helytállóak-e. Segíts megbízható forrásokat találni az állításokhoz! Lásd még: A Wikipédia nem az első közlés helye.

A számelméletben a prímfelbontás (törzstényezős felbontás, esetleg prímfaktorizáció) az a folyamat, amikor egy összetett számot prím osztóira (törzstényezőire) bontjuk (faktorizáljuk). A törzstényezők szorzata az eredeti egész számmal egyenlő. Az eljárás eredménye prímek (prímhatványok) szorzata. Ezt a formulát az eredeti szám kanonikus alakjának nevezzük.

A számelmélet alaptétele szerint minden 1-nél nagyobb pozitív egész szám egyértelműen, azaz egy és csak egyféleképpen bontható fel prímszámok szorzatára.

Nagy számok esetében nem ismerünk minden esetben hatékony algoritmust a prímtényezőkre bontásra; nemrégiben egy az RSA-eljárás által kiírt pályázaton mintegy másfél évet, és kb. fél évszázadnyi gépidőt vett volna igénybe egy 200 jegyű szám felbontása becslési eljárásokkal történt számítások szerint. A prímtényezőkre bontás feltételezett bonyolultságát számos kriptográfiai algoritmus használja ki. A matematika és az informatika számos területe foglalkozik a problémával, köztük az elliptikus görbék, algebrai számelmélet és a kvantumszámítógépek területei.

Adott hosszúságú számok közül vannak könnyebben és nehezebben faktorizálhatók. Jelenlegi tudásunk szerint a legnehezebb esetek közé tartoznak a két, véletlenül választott, közel azonos nagyságú prímszám szorzataként előálló számok.

Ez a szócikk egy példát mutat olyan algoritmusra, ami jól működik olyan számokon, ahol a prímtényezők kicsik.

Egy egyszerű faktorizáló eljárás

Leírás

Az alábbiakban leírunk egy rekurzív eljárást számok prímtényezős felbontására: Adott egy n szám

  • ha n prím, készen vagyunk, megvan a prímtényezős felbontás.
  • ha n összetett, osszuk el n-t az első p 1 {\displaystyle p_{1}\,} prímmel.
    • Ha az osztás maradék nélküli, kezdjük újra az algoritmust az n p 1 {\displaystyle {\frac {n}{p_{1}}}} értékkel, s adjuk hozzá p 1 {\displaystyle p_{1}\,} -et az n prímtényezős listájához.
    • Ha az osztás maradékos volt, akkor osszuk n-t a következő p 2 {\displaystyle p_{2}\,} prímmel,[1] és így tovább, amíg az aktuális n p i {\displaystyle {\frac {n}{p_{i}}}} érték 1 nem lesz, maradék nélkül. Ekkor megállunk.

Megjegyezzük, hogy elég csupán azokkal a p i {\displaystyle p_{i}\,} prímmekkel osztani n-t melyekre igaz, hogy p i n {\displaystyle p_{i}\leq {\sqrt {n}}} .

Példa

Adott 9438, ennek szeretnénk megkapni a prímtényezős felbontását.
9438/2 = 4719 , a maradék 0, tehát 2 prímtényezője 9438-nak. megismételjük az eljárást 4719-cel
4719/2 = 2359, a maradék 1, tehát 2 NEM prímtényezője 4719-nek. a következő prímmel, a 3-mal próbálkozunk
4719/3 = 1573, a maradék 0, tehát 3 prímtényezője 4719-nek (azaz 9438-nak is). megismételjük az algoritmust 1573-mal
1573/3 = 524, a maradék 1, tehát a 3 NEM prímtényezője 1573-nak. a következő prímmel, az 5-tel próbálkozunk
1573/5 = 314, a maradék 3, tehát az 5 NEM prímtényezője 1573-nak. a következő prímmel, a 7-tel próbálkozunk
1573/7 = 224, a maradék 5, tehát 7 NEM prímténezője 1573-nak. a következő prímmel, a 11-gyel próbálkozunk
1573/11 = 143, a maradék 0, tehát 11 prímtényezője 1573-nak (azaz 9438-nak is). megismételjük az eljárást 143-mal
143/11 = 13, a maradék 0, tehát 11 prímtényezője 143-nak (azaz 9438-nak is). megismételjük az algoritmust 13-mal
13/11 = 1, de a maradék 2, tehát 11 NEM prímtényezője 13-nak. a következő prímmel, a 13-mal próbálkozunk
13/13 = 1, a maradék 0, tehát 13 prímtényezője 13-nak (azaz 9438-nak is). Megállunk, mert elértünk 1-hez

így a végére a következőt kapjuk 9438 = 2 × 3 × 11 × 11 × 13.

Programkód

Alábbiakban pedig láthatunk egy C programnyelven írt algoritmust 2 és 18 446 744 073 709 551 615 közötti számok faktorizációjára ( 2 64 1 {\displaystyle 2^{64}-1} ):

#include <stdio.h>
 
int main(void) {
	int t[100];
    unsigned long long j, i, k, d; //ha csak a pozitív számokat vesszük
    while (1==scanf("%llu", &k)) {
        if (k<0) k*=(-1);
        i=0;
        d=2;
        while (k>1) {
            if (k%d==0) {
                k/=d; 
                t[i]=d;
                i++;
            } else {
                ++d;
            }
        }
        for (j=0;j<i;j++) {
            printf("%d ", t[j]);
        }
        printf("\n\n");
    }
    return 0;
}

Időhiány

A fent vázolt algoritmus jól működik kis n-re, de kivitelezhetetlenné válik, ahogy az n egyre nagyobb szám lesz. Például egy 18 jegyű (másképp 60 bites) szám esetén, minden 1 000 000 000-nál kisebb prímet tesztelni kell, ami még egy számítógépnek is nehéz feladat. Két jeggyel növelve a számot, a faktorizáció számításigénye a 10-szeresére növekszik.

Mivel az osztók párban helyezkednek el, ezért elég n {\displaystyle {\sqrt {n}}} -ig ellenőrizni a számokat, hogy van-e osztó.

Épp ez, a nagy (több száz jegyű) számok faktorizációjának (időbeli) problémája adja az alapját a modern kriptográfiának. És ez ösztönzi a kutatást olyan gyors eljárás után, mely polinom időn belül képes faktorizálni. A dolog jellegéből fakadóan, ha meg is születik (született?) egy hatékony algoritmus, az – Babbage eredményeihez hasonlóan – sokáig katonai titoknak fog számítani, mert hatalmas stratégiai jelentősége van.

Kapcsolódó szócikkek

Jegyzetek

  1. Elég itt egyesével léptetni a számot, ugyanis ha p1+1 nem prím akkor azzal nem lesz osztható a szám, tehát automatikusan léptetjük. Ez azért van, mert összetett számnak van magánál kisebb prímosztoja, ami az algoritmus szerint már szerepelt a ciklusban.

További információk

  • Alice és Bob - 16. rész: Alice és Bob alaptétele
Sablon:Osztóosztályok
  • m
  • v
  • sz
Az egész számok oszthatóságon alapuló csoportosítása
Áttekintés
60 osztói
Prímtényezős felbontás
Osztóösszegek
Sok osztóval rendelkező
Osztóösszeg-sorozattal kapcsolatos
Egyéb csoportok
Sablon:Prímszámok osztályozása
  • m
  • v
  • sz
Prímszámok osztályozása
Képlet alapján
Számsorozat alapján
Tulajdonság alapján
Számrendszerfüggő
  • Boldog
  • Diéder
  • Palindrom
  • Mírp
  • Repunit (10n − 1)/9
  • Permutálható
  • Körkörös
  • Csonkolható
  • Középpontosan tükrös
  • Minimális
  • Gyenge
  • Full reptend
  • Unikális
  • Primeval
  • Önös
  • Smarandache–Wellin
Mintázatok
  • Iker (p, p + 2)
  • Ikerprímlánc (n − 1, n + 1, 2n − 1, 2n + 1, …)
  • Prímhármas (p, p + 2 vagy p + 4, p + 6)
  • Prímnégyes (p, p + 2, p + 6, p + 8)
  • prím n−es
  • Unokatestvér (p, p + 4)
  • Szexi (p, p + 6)
  • Chen
  • Sophie Germain (p, 2p + 1)
  • Cunningham-lánc (p, 2p ± 1, …)
  • Biztonságos (p, (p − 1)/2)
  • Számtani sorozatban (p + a·n, n = 0, 1, …)
  • Kiegyensúlyozott (egymást követő p − n, p, p + n)
Méret alapján
  • Titáni (1000+ számjegy)
  • Gigantikus (10 000+)
  • Mega (1 000 000+)
  • Ismert legnagyobb
Komplex számok
Összetett számok
Kapcsolódó fogalmak
Az első 100 prím
  • 2
  • 3
  • 5
  • 7
  • 11
  • 13
  • 17
  • 19
  • 23
  • 29
  • 31
  • 37
  • 41
  • 43
  • 47
  • 53
  • 59
  • 61
  • 67
  • 71
  • 73
  • 79
  • 83
  • 89
  • 97
  • 101
  • 103
  • 107
  • 109
  • 113
  • 127
  • 131
  • 137
  • 139
  • 149
  • 151
  • 157
  • 163
  • 167
  • 173
  • 179
  • 181
  • 191
  • 193
  • 197
  • 199
  • 211
  • 223
  • 227
  • 229
  • 233
  • 239
  • 241
  • 251
  • 257
  • 263
  • 269
  • 271
  • 277
  • 281
  • 283
  • 293
  • 307
  • 311
  • 313
  • 317
  • 331
  • 337
  • 347
  • 349
  • 353
  • 359
  • 367
  • 373
  • 379
  • 383
  • 389
  • 397
  • 401
  • 409
  • 419
  • 421
  • 431
  • 433
  • 439
  • 443
  • 449
  • 457
  • 461
  • 463
  • 467
  • 479
  • 487
  • 491
  • 499
  • 503
  • 509
  • 521
  • 523
  • 541
Nemzetközi katalógusok
  • Informatika Informatikai portál • összefoglaló, színes tartalomajánló lap