Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Jupyter notebook 2016-05-09-202158.ipynb

1527 views
Kernel: Python 2 (SageMath)

1.Prosti brojevi

Prosti brojevi ili prim-brojevi su svi prirodni brojevi djeljivi bez ostatka samo s brojem 1 i sami sa sobom, a veći od broja 1. Prirodni brojevi koji su veći od broja 1, a nisu prosti brojevi nazivaju se složenim brojevima. Na primjer, 5 je prost broj jer je djeljiv samo s 1 i 5, a 6 je složen broj jer osim što je djeljiv s 1 i 6 dodatno može biti podjeljen s brojevima 2 i 3. Napomena: Broj 1 nije ni prost, ni složen.

Čemu prosti brojevi služe?

Prosti brojevi služe pri faktorizaciji, odnosno rastavljanju složenih brojeva na prim-faktore. Svaki složeni broj može se na jedinstven način rastaviti na prim-faktore.

Teorem(osnovni teorem aritmetike): Svaki se prirodan broj može prikazati kao produkt prostih faktora. Slijedi da se svaki prirodan broj n može zapisati u kanonskom obliku kao produkt potencija prostih brojeva. n=p1α1p2α2...pkαkn = p_1^{\alpha_1}p_2^{\alpha_2}...p_k^{\alpha_k} Faktorizacija na proste faktore je jedinstvena do na poredak faktora.

Eratostenovo sito

Eratostenovo sito (rešeto) je jednostavan algoritam za dobivanje svih prostih brojeva manjih od unaprijed izabranoga prirodnog broja. Osmislio ga je grčki matematičar, geograf i astronom Eratosten.

Postupak dobivanja prostih brojeva pomoću Eratostenovog sita:

  1. napišemo proizvoljan broj uzastopnih prirodnih brojeva počevši od 2

  2. zaokružimo najmanji neoznačeni broj

  3. precrtamo sve njegove višekratnike, koji nisu već označeni

  4. ponavljamo postupak od 2. koraka dok svi brojevi nisu označeni (zaokruženi ili precrtani)

from IPython.display import Image Image(url='https://matematickasekcija.files.wordpress.com/2011/12/eratosten3.jpg')

Primjer: Provjeravamo je li prirodan broj 30 prost:

from numba import jit from math import sqrt @jit def je_li_prost(x): true = 1 for i in xrange(2,int(sqrt(x)+1)): if(x % i == 0): true=0 break if(true): return 1 else: return 0 x=30 if(je_li_prost(x)==1): print('Broj {} je prost!'.format(x)) else: print('Broj {} nije prost!'.format(x))
Broj 30 nije prost!

Primjer rastava broja na proste faktore: 30230|2 15315|3 555|5 11

30=23530 = 2 * 3 * 5

Definicija:Najveći zajednički djelitelj dvaju brojeva je najveći broj kojim su djeljiva ta dva broja. Na isti se način definira i najveći zajednički djelitelj nzdnzd više brojeva.

Npr., najveći zajednički djelitelj brojeva 2 i 8 je:

from sympy import * gcd(2,8)
2

Pišemo:nzd(2,8)=2nzd(2, 8) = 2 ili ponekad pišemo M(2,8)=2(mjera)M(2, 8) = 2 (mjera).Primijetimo da je najveći zajednički djelitelj relativno prostih brojeva jednak 1 pa je nzd(10,21)nzd(10,21) jednako:

gcd(10,21)
1
from numpy import * niz = random.randint(1,100,50) vektorizirana = vectorize (je_li_prost) vektorizirana(niz)
array([0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0])
niz
array([90, 3, 5, 29, 50, 62, 24, 12, 81, 40, 86, 62, 68, 71, 30, 17, 58, 10, 45, 92, 23, 76, 4, 89, 58, 9, 40, 6, 16, 80, 97, 43, 37, 99, 8, 76, 92, 68, 16, 34, 38, 79, 52, 33, 77, 13, 46, 1, 80, 49])

U gornjem primjeru vektorizirali smo našu funkciju * je_li_prost * i zatim smo provjerili za neki random niz koji su brojevi prosti, a koji nisu u njemu.

Definicija: Najmanji zajednički višekratnik dvaju ili više brojeva je najmanji broj koji je djeljiv svim tim brojevima.

Tako je najmanji zajednički višekratnik (nzv)(nzv) brojeva 6 i 4 jednak:

lcm(6,4)
12

Dakle: nzv(6,4)=12nzv(6, 4) = 12 ili ponekad kraće v(6,4)=12(visˇekratnik).v(6, 4) = 12 (višekratnik).

Relativno prosti brojevi

Relativno prosti brojevi su prirodni brojevi koji nemaju zajedničkog djelitelja osim 1.

Primjer: Provjeravamo jesu li prirodni brojevi 48 i 57 relativno prosti:

@jit def rel_prost(x,y): true=1 if(x<y): for i in xrange(2,x+1): if((x%i == 0) & (y%i == 0)): true=0 break else: for i in range(2,y+1): if(x%i == 0 & y%i == 0): true=0 break return true x=48 y=57 if(rel_prost(x,y)): print('Brojevi {} i {} su relativno prosti'.format(x,y)) else: print('Brojevi {} i {} nisu relativno prosti'.format(x,y))
Brojevi 48 i 57 nisu relativno prosti

*Sljedeći kod računa Eulerovu funkciju nekog prirodnog broja: Npr. n=10 *

def Euler(n): brojac = 0 for i in range(1,n): if(rel_prost(i,n)): brojac += 1 return brojac Euler(10)
4

EUKLIDOV ALGORITAM: Za prirodne brojeve a i b vrijedi: nzd(a,b)=nzd(a,ab).nzd(a, b) = nzd(a, a − b).

Koristeći Euklidov algoritam izračunajmo nzd(32,48)nzd(32,48):

@jit def nzd(x,y): while(x != y): if(x > y): x -= y else: y -= x return x x=32 y=48 print('nzd({},{}) = {}'.format(x,y,nzd(x,y)))
nzd(32,48) = 16

Neka još neodgovorena pitanja o prostim brojevima su:

  1. Postoji li općenita formula koja izračunava nn-ti prosti broj?

  2. Postoji li formula za izračunavanje nn-tog prostog broja pnp_n?

  3. Postoji li formula za izračunavanje prvog sljedećeg prostog broja, pn+1p_n+1, nakon što je zadan prethodni prosti broj pnp_n?

  4. Koliko je prostih brojeva manjih od nekog zadanog broja xQx \in\mathbb{Q}?

Teorem: Postoji beskonačno mnogo prostih brojeva.

Najveći dosad pronađeni prosti broj je: 274.207.2811.2^{74.207.281}-1.

Taj broj ima nevjerovatnih 22.338.618 cifara i nemoguće ga je napisati u njegovom originalnom obliku. Međutim u sljedećem videu možete vidjeti knjigu koja se sastoji od svih cifara tog prostog broja:

from IPython.display import YouTubeVideo YouTubeVideo('tlpYjrbujG0')

Fermatovi brojevi

Definicija: Brojevi fn=22n+1f_n = 2^{2^n} + 1 zovu se Fermatovi brojevi.

Napomena: Fermat je smatrao da su svi brojevi ovog oblika prosti. Zaista, f0=3,f1=5,f2=17,f3=257,f4=65537f_0 = 3,\,f_1 = 5,\,f_2 = 17,\, f_3 = 257,\,f_4 = 65537 jesu prosti brojevi. No, f5=232+1f_5 = 232 + 1 nije prost jer 641f5 641 |\, f_5. Postoji hipoteza koja kaže da je samo konačno mnogo Fermatovih brojeva koji su prosti.

from IPython.display import Image Image(url='https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Pierre_de_Fermat.jpg/150px-Pierre_de_Fermat.jpg')

Fermatov broj Fn=22n+1F_n = 2^{2^n} + 1 za n1n ≥ 1 može se geometrijski prikazati kao kvadrat s duljinom stranice 22n12^{2^{n−1}} uvećan za jedinični kvadrat. Zaista, Fn=(22n1)2+1F_n = (2^{2^{n−1}})^2 + 1.

from sympy import * from sympy import init_printing init_printing() n = Symbol('n') simplify((2**(2**(n-1)))**2+1)
22n+12^{2^{n}} + 1
from IPython.display import Image Image(url='data:image/png;base64,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')

Definicija: S π(x)\pi(x) ćemo označavati broj prostih brojeva pp takvih da je pxp \leqslant x. Godine 1896. Hadamard i de la Valle Poussin su pokazali da je π(x)xlnx\pi(x) \sim \frac{x}{ln x}.

import matplotlib.pyplot as plt from pylab import * from numpy import * x = linspace(2,999,1000) y = x/log(x) fig, axes = plt.subplots() axes.plot(x,y,'r',label=r"$\pi(x)$") axes.set_xlabel(r"$x$",fontsize=18) axes.set_ylabel(r"$y$",fontsize=18) axes.legend(loc=0) axes.axhline(y=0,xmin=2,xmax=500) axes.set_title('Distribucija prostih brojeva');
Image in a Jupyter notebook

Kriptiranje podataka

*Još u doba Cezara, prije više od 2000 godina, ljudi su se bavili problemom zaštite poruka i raznih podataka od čitatelja kojima oni nisu bili namijenjeni. Tako je, na primjer, Cezar smislio jednostavan način zaštite poruka: svako slovo u poruci zamijenio je sa nekim slovom koje je bilo ispred njega u abecedi za određeni pomak. Na primjer, slovo a mijenjao bi slovom c, slovo b slovom d itd. Broj mjesta za koje se slova pomiču u abecedi je vrsta kriptografskog ključa. Primatelj tako kriptirane poruke jednostavno bi učinio suprotno od pošiljatelja, tj. umjesto c pisao a itd., te tako pročitao skrivenu poruku. Iako jednostavan i vrlo nesiguran način kriptiranja podataka, posjeduje jedno temeljno svojstvo koje je i danas potrebno u mnogim kriptografskim primjenama: i pošiljatelj i primatelj moraju poznavati ključ pomoću kojega je obavljena enkripcija. Takva metoda enkripcije poznata je pod nazivom metoda tajnog ključa. Nije teško zamisliti slučajeve u kojima metoda tajnog ključa nije efikasna. Na primjer, kupac želi kupiti robu preku interneta, ali ne želi da podaci o njegovoj kreditnoj kartici, koje šalje prodavaču, budu dostupni nekoj trećoj osobi. Kako to učiniti? Podaci dakako trebaju biti kriptirani dok se šalju, ali kako će i pošiljatelj i primatelj u ovom slučaju znati tajni ključ? Jedno od mogućih rješenja ovog problema je korištenje metode kriptiranja pomoću javnog ključa. Poruka se kriptira jednim ključem, a dekriptira drugim. U nastavku, razmatramo jednu čestu i vrlo važnu metodu takvog kriptiranja podataka, RSA. Prosti brojevi se koriste za kriptiranje podataka. *

RSA

*RSA je algoritam za enkripciju pomoću javnog ključa: koristeći javni ključ, koji je svima dostupan, svatko može kriptirati poruku koja je upućena onome tko je ključ objavio. Međutim, pomoću javnog ključa moguće je samo kriptirati, a ne i dektriptirati poruke. Kriptiranu poruku moguće je dekriptirati samo pomoću tzv. tajnog ključa, koji je poznat samo osobi koja je objavila javni ključ. Javni i tajni ključ su matematički povezani i teoretski je moguće izračunati jedan iz drugog (veza će biti detaljno prikazana kasnije), međutim, smatra se da uz današnje poznavanje matematike i današnje brzine računala, to nije moguće učiniti u nekom razumnom vremenu, te se stoga RSA smatra sigurnim algoritmom. Jedna od poznatijih praktičnih primjena RSA je za siguran transfer podataka preko interneta: osobnih podataka, a posebno novčanih transakcija. Naziv RSA nastao je od početnih slova imena troje ljudi koji su ga prvi javno objavili: Ron Rivest, Adi Shamir i Leonard Adleman. Oni su tu objavu učinili 1977. godine. Kasnije se ispostavilo da je Cllifford Cocks, britanski matematičar koji je radio za britansku tajnu službu, otkrio identičan kriptografski sustav već 1973.; međutim, obzirom na visoku cijenu računala koja su tada mogla izvoditi takve algoritme, prijedlog nije zaživio u stvarnosti. K tome, Cocksovo otkriće je nosilo oznaku „top secret“, te je ono postalo poznato javnosti tek 1997. Tako je RSA trojka ostala zapisana u povijesti kao izumitelj tog važnog algoritma. *