Debreceni Egyetem
Természettudományi és Technológiai Kar
Matematikai Intézet

Szakdolgozat

Faktorizációs eljárások
készítette:

Zsidai Emesetémavezet®: Dr. Tengely Szabolcs

Debrecen, 2017

Tartalomjegyzék

Tartalomjegyzéki

1 Speciális célú faktorizációs algoritmusok3

2 Általános célú faktorizációs algoritmusok

11

Irodalomjegyzék

23

1.1.
1.2.
1.3.
1.4.

Próbaosztás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fermat-féle faktorizáció . . . . . . . . . . . . . . . . . . . . . . . .
Rho módszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Euler faktorizáció . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3
3
5
6

2.1. Dixon faktorizáció . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2. Lánctört faktorizáció . . . . . . . . . . . . . . . . . . . . . . . . . . 16iKöszönetnyilvánítás

Ezúton szeretnék köszönetet mondani mindazoknak, akik bármilyen formában
hozzájárultak szakdolgozatom elkészítéséhez. Legf®képp a szüleimnek, az egyetemi éveim alatt nyújtott támogatásukért, türelmükért és a tanulmányaim elvégzéséhez szükséges anyagi háttér biztosításáért.

1

1. Speciális célú faktorizációs
algoritmusok

Faktorizációs eljárásokkal egész számok prímtényez®s felbontását adhatjuk meg.
Kisebb számok esetén ezek az algoritmusok könnyen elvégezhet®ek, viszont ha egy
szám elegend®en nagy, nem ismerünk olyan eljárást, amely a felbontást gyorsan
elvégezné. Ezt használják fel a titkosításban. A speciális és az általános célú
algoritmusok a faktorizációs eljárások két nagy típusa [10] .

Speciális célú algoritmusok olyan összetett egész számokra alkalmazhatóak,
melyek elég kicsik vagy kis osztókkal rendelkeznek. Ekkor az algoritmusok gyorsan
végrehajthatóak.

1.1. Próbaosztás
Kis számok esetén alkalmazhatjuk, legkönnyebben megérthet® algoritmus. A [7]forrást követve haladtunk.
Az n összetett számot szeretnénk faktorizálni. Osszuk el n az els® p1 prímmel, haaz osztás maradék nélküli, írjuk le p1 -t, és folytassuk a vizsgálatot pn1 -el. Ha az
osztás maradékos volt, akkor osszuk n-t a következ® prímmel, amíg pni nem lesz√egyenl® 1-el, maradék nélkül. Az n szám osztói a [1, n] intervallumból kerülnek
√ki, ezért elegend® a vizsgálatot n-ig elvégezni.

Példa
n = 114, p1 := 2, k1 osztja 114-et, folytassuk a vizsgálatot pn1 -el, 57 legkisebb
prímosztója p2 = 3, pn2 = 19, 19 prím, tehát 114 = 2 ∗ 3 ∗ 19.

1.2. Fermat-féle faktorizáció
A Fermat-féle faktorizáció esetén a [3] irodalomra támaszkodtunk.
Olyan n számokra alkalmazhatjuk a Fermat-féle faktorizációt, mely felírható
két négyzetszám különbségeként.
3

4

FEJEZET 1.

SPECIÁLIS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK

1.2.1. Tétel. Legyen n páratlan egész szám. Ekkor létezik n a ∗ b alakú felbontásaés

t2 − s2 alakú felírása között egy egyértelm¶ hozzárendelés.

a−b 2
2
A tétel következik n felírásából: n = a ∗ b = ( a+b2 ) − ( 2 ) ahol
a−b 2
2t = ( a+b2 ) s=( 2 )Bizonyítás.

A Fermat faktorizáció Sage kódja:@interactdef _(n=('$N$',141467)):
a=ceil(sqrt(n))
b=a^2-nwhile not is_square(b):a += 1b=a^2-npretty_print(html('$%s$ felírható $t^2-s^2=%s^2-%s^2$ alakban.
'%(latex(n),latex(a),latex(sqrt(b)))))
pretty_print(html('$t^2-s^2=(t-s)*(t+s)=a*b.$'))
pretty_print(html('Tehát $N$ két osztója: $a=%s$ és $b=%s$'%(latex(a-sqrt(b)),latex(a+sqrt(b)))))
return a-sqrt(b),a+sqrt(b)Példák az el®z® kód futási képére:

1.3.

RHO MÓDSZER

5

1.3. Rho módszer
A Rho módszer esetén szintén [3] forrást használtuk fel.
Az n ∈ N szám prímosztóit úgy kaphatjuk meg, hogy választunk egy egész együtthatós egyszer¶ polinomot, például: f (x) = x2 +1. Választunk egy x0 kezd®pontot(i = 1, 2 . . .) és elvégezzük a következ®ket:
x1 = f (x0 ) mod nx2 = f (x1 ) mod n..
.

xi+1 = f (xi ) mod n.
Összehasonlítjuk xj azon értékeit, amelyek különböz® osztályokban vannak(mod n), de ugyanabban (mod t). Ekkor t egy osztója n-nek.
Tehát (xj − xi , n) értékeit teszteljük, amíg n valódi osztóját meg nem kapjuk.

Az alábbiakban megtalálható egy Sage kód, amely egy tetsz®leges szám faktorizációját adja meg, Rho-módszer segítségével:def fv(x,n):
return mod(x^2-1,n)@interactdef _(n=('$n$',1387)):
a=2
b=2
d=1
rows = []while d == 1:
a=fv(a,n)b=fv(fv(b,n),n)d=gcd(a-b,n)rows.append([a,b,d])pretty_print(table(rows,header_row=["$x$","$y$","lnko"],frame=True))if d == n:print "faktorizáció triviális eredményt adott: ",dreturn -1
else:
print n," egy osztója: ",dNéhány példa:6

FEJEZET 1.

SPECIÁLIS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK

1.4. Euler faktorizáció
Az Euler-féle faktorizáció felhasználja BrahmaguptaFibonacci azonosságot, mely
segítségével megadhatjuk n szám osztóit.

1.4.1. Tétel (BrahmaguptaFibonacci-féle azonosság). Tetsz®leges a, b, c, d egész
számok esetén:(a2 +b2 )(c2 +d2 ) = (ac−bd)2 +(ad+bc)2 = (ac+bd)2 +(ad−bc)2 .

Az azonosságról b®vebben a [8]-ban olvashatunk.
Az n számot szeretnénk faktorizálni. Felírjuk n-t két különböz® négyzetszámösszegeként: n = a2 + b2 = c2 + d2 .
Ekkor a2 − c2 = d2 − b2 ebb®l következik, hogy (a − c)(a + c) = (d − b)(d + b).
Jelöljük a − c és d − b legnagyobb közös osztóját k -val,az a + c és d + b legnagyobb
közös osztóját pedig h-val. Az l, m, l0 , m0 kostansokkal kielégítjük a következ®
egyenleteket:(a − c) = kl
(d − b) = km
(a + c) = hm0(d + b) = hl0
Az l, m és l0 , m0 relatív prímek lesznek. Behelyettesítve az (a − c)(a + c) =(d − b)(d + b) egyenletbe kapjuk, hogy klhm0 = kmhl0 . Ekkor k -val és h-val egyszer¶sítve kapjuk, hogy lm0 = l0 m. Mivel (l, m) = 1 és (l0 , m0 ) = 1, ezért l = l0
illetve m = m0 . Tehát(a − c) = kl
(d − b) = km
(a + c) = hm
(d + b) = hl
Láthatjuk, hogy a + c és d − b legnagyobb közös osztója m,a − c és d + b legnagyobb közös osztója pedig l lesz.

1.4.

EULER FAKTORIZÁCIÓ

7

Alkalmazva BrahmaguptaFibonacci-féle azonosságot azt kapjuk, hogy(k 2 + h2 )(l2 + m2 ) = (kl − hm)2 + (km + hl)2 = ((a − c) − (a + c))2 + ((d − b) +(d + b))2 = (2c)2 + (2d)2 = 4n,(k 2 + h2 )(l2 + m2 ) = (kl + hm)2 + (km − hl)2 = ((a − c) + (a + c))2 + ((d − b) −(d + b))2 = (2a)2 + (2b)2 = 4n.
Mivel minden tényez® összege két négyzetszám, ezért (k, h) vagy (l, m) páros számok. Az általánosság elvesztése nélkül, tegyük fel, hogy (k, l) páros.
Ekkor n felbontása egyenl® lesz 2  2 !
hk+l2 + m2 .
2
2
Az Euler faktorizációhoz [9] irodalmat használtuk fel.

Egy tetsz®leges egész szám faktorizációjának Sage kódja, Euler faktorizációval:@interactdef _(n=('$N$',2020)):var('x,y')N=solve_diophantine(x^2+y^2==n)l=len(N)i=0v=[]
while i < l :if (N[i][0] > 0 and N[i][1] > 0):v.append(N[i])i=i+1
if len(v) == 2 :a, b, c, d = v[0][0], v[0][1], v[1][0], v[1][1]
if (a-c)%2==1:
c1=d
d=c
c=c1
k=gcd(a-c,d-b)l=(a-c)//km=(d-b)//kn=(a+c)//m
N=a^2+b^2
ac=(a-c)db=(d-b)

8

FEJEZET 1.

SPECIÁLIS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK

pretty_print(html('$N$ felírható két négyzetszámpár
különbségeként, azaz :$a^2+b^2=c^2+d^2=%s$'%latex(N)))
pretty_print(html('$a=%s$'%latex(a)))
pretty_print(html('$b=%s$'%latex(b)))
pretty_print(html('$c=%s$'%latex(c)))
pretty_print(html('$d=%s$'%latex(d)))
pretty_print(html(r'$(a-c)=%s$ és $(d-b)=%s$
legnagyobb közös osztója:$k=%s$'%(latex(ac),latex(db),latex(k))))pretty_print(html(r"$l=\displaystyle\frac{(a-c)}{k}=%s$"%latex(l)))
pretty_print(html(r"$m=\displaystyle\frac{(d-b)}{k}=%s$"%latex(m)))
pretty_print(html(r"$n=\displaystyle\frac{(a+c)}{m}=%s$"%latex(n)))
oszto1=(k//2)^2+(n//2)^2
oszto2=m^2+l^2
pretty_print(html(r"az egyik osztó:$\left(\displaystyle\frac{k}{2}\right)^2+\left(\displaystyle\frac{n}{2}\right)^2=%s$"%latex(oszto1)))pretty_print(html(r"a másik osztó: $m^2+l^2=%s$"%latex(oszto2)))pretty_print(html(r'Tehát $N$ felírható a következ® módon:$%s\times %s$'%(latex(oszto1),latex(oszto2))))else:
pretty_print(html('$Nem\ megoldható.$'))
Példa olyan számra, ami nem írható fel kétféleképpen két négyzetszám összegeként:

Néhány példa olyan n egészekre, melyekre alkalmazható az Euler faktorizáció.
Azaz n felírható a2 + b2 = c2 + d2 alakban:

1.4.

EULER FAKTORIZÁCIÓ

9

2. Általános célú faktorizációs
algoritmusokÁltalános célú algoritmusokat bármelyik összetett szám esetén alkalmazhatunk.
Hátránya, hogy a könnyebb számokat is ugyanannyi id® alatt faktorizálják le,mint a nehezebbeket. Az ilyen típusú algoritmusokat használjuk az RSA számok
esetén. Az RSA titkosítási rendszerr®l a [3] forrásban olvashatunk.

2.0.1. Deníció (B sima). Legyen B = p1 , . . . , pk egy halmaz, ahol p1 , p2 , . . .

prímek. Ekkor k ∈ Z+ -t akkor nevezzük B simának, ha k összes prím osztója
kisebb, mint B .

2.1. Dixon faktorizáció
A Dixon faktorizáció esetében a [1], [6] forrásokat követve haladtunk.
Az N ∈ N számot szeretnénk faktorizálni.
Válasszunk egy B korlátot és az ennél kisebb prímek halmazát jelöljük B -vel, ez
lesz a fakorbázis. Olyan pozitív egész z -t keresünk, melyre z 2 mod N B simaszám lesz, azaz legkisebb abszolút érték¶ maradéka felírható B -beli számok szorzataként:

zk2 ≡

k
Y
a
pj j,i(mod N ).

i=1

A aj,i kitev®ket rögzítsük a


a1i


 a2i vi =  .  .. 
ak,i


11

12

FEJEZET 2.

ÁLTALÁNOS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK

vektorokban. A vektorokból készítsünk mátrixot:
a11 a12 . . . a1k a21 a22 . . . a2k 
 .
..
..
.. 
 .
.
.
.
. 
 .

ak1 a2k . . . akk

Nem triviális lineáris kombináció megtalálásához használhatjuk a Gauss eliminációt (mod 2).

z12 z22 . . . zt2 ≡Yapi i,1+ai,2 +...+ai,t(mod N ).

pi ∈BHa találunk ilyen x, y párt, melyre teljesül x2 ≡ y 2 (mod N ) és x 6≡ ±y (mod N )kongruencia, akkor készen vagyunk, ha nem teljesülnek, akkor további B simaszámokat keresünk. N két nem triviális osztóját kaphatjuk:


sY
k
Y
a
pi i,j , N lnko  ziei +
i=1

és

pi ∈B


sY
k
Y
a
pi i,j , N  .
lnko  ziei −


i=1

pi ∈B

Dixon faktorizáció Sage kódja:@interactdef _(n=('$N$',6216577),B=('$B$',7)):w=[]
for i in [1..B]:
if is_prime(i):w=w + [i]x=ceil(sqrt(n))
a=(x^2)%nq=[valuation(a,k) for k in w]
A=[]
K=[]
T=Truewhile T:
p=0
while p!=1:
x += 1a=(x^2)%np=a/prod([k^valuation(a,k) for k in w])

2.1.

DIXON FAKTORIZÁCIÓ

13

q=[valuation(a,k) for k in w]
K.append(x)A.append(q)p=0
Q=matrix(GF(2),A).transpose()
if Q.right_kernel().dimension()>0:
Qv=sum(Q.right_kernel().basis())
Av=sum([vector(A[k]) for k in [0..len(A)-1] if Qv[k]==1])
av=prod([w[s]^Av[s] for s in [0..(len(w)-1)]]).nth_root(2)Kv=prod([K[k] for k in [0..len(A)-1] if Qv[k]==1])
d1=gcd(Kv-av,n)d2=gcd(Kv+av,n)
if Set([1,n])!=Set([d1,d2]):
T=FalseDH=[(k,n//k) for k in [d1,d2] if k!=1 and k!=n]pretty_print(html('$B$ faktorbázis elemei: $%s$'%latex(w)))
pretty_print(html('Egy $p_i$ szám akkor B sima, ha $p_i^2\ (mod\ N)$legkisebb abszolút érték¶ maradéka B faktorbázis szorzataiból áll.'))pretty_print(html(r'B sima számok $N$-re nézve: $%s$.'%latex(K)))
pretty_print(html('Ezen B-beli számok felbontását tároljuk elvektorokban. '))pretty_print(html('A vektor koordinátái a faktorbázisban lév®
prímekhez tartozó kitev®k a megfelel® sorrendben $%s$ '%latex(A)))
pretty_print(html('Az összegy¶jtött vektorokból készítsünk egy
mátrixot $(mod\ 2)$ : $%s$, melyre alkalmazzuk a Gauss eliminációt.'%latex(Q)))
pretty_print(html('Az egyenletrendszer megoldása: $%s$ := ${a_{i,j}}$ .'%latex(Av)))
pretty_print(html('$\displaystyle\sqrt{\prod_{b_i \in B} b_i^{a_{i,j}}}$ =$%s$, ahol $b_i$ a faktorbázis elemei.'%latex(av)))pretty_print(html('$\displaystyle\prod_{i=1}^k p_i$ = $%s$'%latex(Kv)))
pretty_print(html('$N$ osztóit a következ®képpen számolhatjuk ki: $lnko\displaystyle( \prod_{i=1}^k p_i \pm \sqrt{\prod_{b_i \in B} b_i^{a_{i,j}}}, N)$'))
pretty_print(html('$lnko(%s+%s,%s)$ és $lnko(%s-%s,%s)$' %(latex(Kv),latex(av),latex(n),latex(Kv),latex(av),latex(n))))pretty_print(html('Tehát $N$ nemtriviális osztói: $%s$' %latex(DH)))
Néhány példa a Dixon faktorizáció Sage kódjának futási képére:

14

FEJEZET 2.

ÁLTALÁNOS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK

2.1.

DIXON FAKTORIZÁCIÓ

15

16

FEJEZET 2.

ÁLTALÁNOS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK

2.2. Lánctört faktorizáció

2.2.1. Deníció. Legyen x ∈ R. Ekkor x lánctörtjegyein a a0 , a1 . . . ∈ Z számokat értjük.
x0 = x; a0 = bx0 c1; a1 = bx1 c
x1 = x0 −a01x2 = x1 −a1 ; a2 = bx2 c..
.
1
ai = bxi c; xi+1 = xi −aiMinden valós számnak létezik lánctört alakja, mely egyértelm¶, valamint ai > 0, ha i ≥ 1.

Megjegyzés.

Megjegyzés.

Ha a0 , a1 , . . . az x valós lánctörtjegyei, akkor az

1

x = a0 +

1

a1 +
a2 +

1
a3 +

1
..
.

lánctört alakját a következ®képpen jelöljük: [a0 , a1 , . . .].

2.2.1. Tétel. Minden x ∈ R \ Q esetén megadható x-et legjobban közelít® racionális szám,

x lánctört alakjának véges kiértékelésével.

A számláló növelésével

tudunk közelebbi racionális számot megadni.
A kiértékelést a következ®képpen adhatjuk meg:x ≈ [a0 , a1 , . . . ak ] = pqkk , aholp0q0 = a0p1
a0 a1 +1 ..
q1 =
a1 .
ai pi−1 +pi−2
piqi = ai qi−1 +ai−2

2.2.2. Tétel. Minden x ∈ Q nem négyzetszám esetén√r = [a0 , a1 , a2 , . . . , a2 , a1 , 2a0 ].

A tételek bizonyítását a [2] , [4] irodalomban találjuk meg.

Az N számot szeretnénk faktorizálni. Konstruáljuk meg a faktorbázist, melya választott korlátnál kisebb prímeket tartalmazza, jelöljük B -vel.
√Írjuk fel N lánctört alakját. Az pqii közelítésekre vizsgáljuk meg, hogy pi B
Qsima szám-e. Azaz (pi )2 ≡ bi ∈B bai i (mod N ) teljesül. A B sima számokhoz
tartozó bi prímek kitev®it rögzítsük egy vektorba, a megfelel® sorrendben. A

2.2.

17

LÁNCTÖRT FAKTORIZÁCIÓ

kapott vektorokból készítsünk mátrixot, melyre alkalmazzuk a Gauss eliminációt
Z2 felett. Ha találunk olyan x, y számot, melyre igaz, hogy x2 ≡ y 2 (mod N ) ésx 6≡ ±y (mod N ) is teljesül akkor készen vagyunk, ha nem teljesül, akkor további
B sima számokat kell keresnünk.
N két nem triviális osztója lehet:


sY
k
Y
a
lnko  pi +bi i,j , N 
i=1

bi ∈B

k
Y

sY

és


lnko 


pi −

i=1

a

bi i,j , N  .

pi ∈BA lánctört faktorizáció esetén a [2] forrást használtuk fel.
A lánctört faktorizáció Sage kódja:@interactdef _(n=('$N$',23449),B=('$B$',7)):w=[]
for i in [1..B]:
if is_prime(i):w=w + [i]n.is_prime()pretty_print(html('$B$ faktorbázis elemei: $%s$'%latex(w)))
sn=sqrt(n)cfn=continued_fraction(sn)t=0
x=cfn.numerator(t)pretty_print(html('$%s$ lánctört alakja: $%s$'%(latex(n),latex(continued_fraction(sqrt(n))))))
A=[]
K=[]
T=Truewhile T:
x=cfn.numerator(t)a=(x^2)%np=a/prod([k^valuation(a,k) for k in w])
if p==1:
q=[valuation(a,k) for k in w]
A.append(q)18

FEJEZET 2.

ÁLTALÁNOS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK

K.append(x)Q=matrix(GF(2),A).transpose()
if Q.right_kernel().dimension()>0:
for Qv in Q.right_kernel().
basis():
Av=sum([vector(A[k])for k in [0..len(A)-1]
if Qv[k]==1])
av=prod([w[s]^Av[s] fors in [0..(len(w)-1)]]).nth_root(2)Kv=prod([K[k] for k in
[0..len(A)-1] if
Qv[k]==1])
d1=gcd(Kv-av,n)d2=gcd(Kv+av,n)
if Set([1,n])!=Set([d1,d2])
and Set([d1,d2])!=Set([1]) and Set([d1,d2])!=Set([n]):pretty_print(html('Egy$p$ szám akkor B sima ha$p^2\ (mod\ N)$ legkisebb
abszolút érték¶ maradéka
B faktorbázis szorzataiból
áll.'))
pretty_print(html('B számok$%s$-re nézve: $%s$ '%(latex(n),latex(K))))
pretty_print(html('Ezen
B-beli számok
felbontását tároljuk elvektorokban. '))pretty_print(html('A vektor
koordinátái afaktorbázisban lév®
prímekhez tartozó kitev®ka megfelel® sorrendben:'))pretty_print(html('$%s$ '%latex(A)))
pretty_print(html('Az összegy¶jtött2.2.

LÁNCTÖRT FAKTORIZÁCIÓ

19

vektorokból készítsünk egy mátrixot$(mod\ 2)$ : $%s$, melyre alkalmazzuk
a Gauss eliminációt.'%latex(Q)))
pretty_print(html('Azegyenletrendszer megoldása:$%s$ := ${a_{i,j}}$ .'%latex(Av)))
pretty_print(html('$\displaystyle\sqrt{\prod_{b_i \in B} b_i^{a_{i,j}}}$= $%s$, ahol $b_i$
a faktorbázis elemei.'%latex(av)))pretty_print(html('$\displaystyle\prod_{i=1}^k p_i$ = $%s$'%latex(Kv)))
pretty_print(html('$N$ osztóit akövetkez®képpen számolhatjuk ki: $lnko
p_i \pm \sqrt{\prod_{b_i \in B} b_i^{a_{i,j}}} , N)$'))
pretty_print(html('$lnko(%s+%s,%s)$és $lnko(%s-%s,%s)$' %(latex(Kv),latex(av),latex(n),latex(Kv),latex(av),latex(n))))pretty_print(html('Tehát $%s$ nem
triviális osztói:$%s,%s$ '%(latex(n),latex(d1),latex(d2))))
T=False
t=t+1
else:
t=t+1
Példák a Sage kód futási képére:

20

FEJEZET 2.

ÁLTALÁNOS CÉLÚ FAKTORIZÁCIÓS ALGORITMUSOK2.2.

LÁNCTÖRT FAKTORIZÁCIÓ

21

Irodalomjegyzék

http://mathworld.wolfram.com/[1]

Dixon'sfactorization
method.
DixonsFactorizationMethod.html.

[2]

Per Leslie Jensen. Integer factorization. http://www.pgnfs.org/DOCS/thesis.
pdf, 2005.

[3]

Liptai Kálmán.
Kriptográa.
Kriptografia.pdf, 2011.

[4]

Niels Lauritzen.
Continued fractions and factoring.
https://pdfs.
semanticscholar.org/a510/fb0836d8741a5ac0f9cb1d2cbbc190637185.pdf.

[5]

WA Stein et al. Sagemath software. http://www.sagemath.org/.

[6]

Wikipedia. Dixon's factorization method. https://en.wikipedia.org/wiki/
Dixon%27s_factorization_method, September 2015.

[7]

Wikipedia.
Prímfelbontás.
ADmfelbont%C3%A1s, 2016.

[8]

Wikipedia. Brahmaguptabonacci identity. https://en.wikipedia.org/wiki/
Brahmagupta%E2%80%93Fibonacci_identity, 2017.

[9]

Wikipedia. Euler's factorization method. https://en.wikipedia.org/wiki/
Euler%27s_factorization_method, January 2017.

[10] Wikipedia. Integer factorization.
factorization, April 2017.

http://liptai.ektf.hu/uploads/2011/12/

https://hu.wikipedia.org/wiki/Pr%C3%

https://en.wikipedia.org/wiki/Integer_23