{"id":315,"date":"2015-12-06T08:46:19","date_gmt":"2015-12-06T08:46:19","guid":{"rendered":"https:\/\/lolosice.edu.pl\/?p=315"},"modified":"2015-12-06T08:46:19","modified_gmt":"2015-12-06T08:46:19","slug":"liczby-pierwsze","status":"publish","type":"post","link":"https:\/\/lolosice.edu.pl\/?p=315","title":{"rendered":"Liczby pierwsze"},"content":{"rendered":"<p>Prezentacja Grzegorza Lewczuka<\/p>\n<p><!--more--><\/p>\n<p><strong>LICZBY PIERWSZE<\/strong><\/p>\n<p><strong>Liczba pierwsza<\/strong>, to liczba naturalna kt\u00f3ra posiada dok\u0142adnie 2 dzielniki: jeden i sama siebie. Czyli: 2,3,5,7,11,13,17,19, itd\u2026<\/p>\n<p>G\u0142\u00f3wne w\u0142asno\u009cci liczb pierwszych:<\/p>\n<p>-Najmniejszy r\u00f3\u017cny od jedynki dzielnik naturalny liczby naturalnej, wi\u0119kszej od jedno\u009cci, jest liczba pierwsza.<\/p>\n<p>&#8211;<a href=\"http:\/\/pl.wikipedia.org\/wiki\/Euklides\">Euklides<\/a> pokaza\u0142, \u017ce \u017caden sko\u0144czony zbi\u00f3r nie zawiera wszystkich liczb pierwszych:<\/p>\n<p>-Niech X b\u0119dzie sko\u0144czonym zbiorem liczb pierwszych. Niech x b\u0119dzie iloczynem wszystkich liczb wyst\u0119pujacych w X (gdy X jest puste, to x=1). Jedynym wsp\u00f3lnym dzielnikiem liczb x oraz x+1 jest 1. Zatem \u017cadna liczba pierwsza, wyst\u0119pujaca w X, nie jest dzielnikiem liczby x+1. Ale x+1 &gt; 1. Wi\u0119c x+1 ma dzielnik p, kt\u00f3ry jest liczba pierwsza. Liczba pierwsza p nie nale\u017cy do X (bo jest dzielnikiem liczby x+1).<\/p>\n<p>-Ka\u017cda liczba naturalna wi\u0119ksza od 1 daje si\u0119 jednoznacznie zapisa\u0107 w postaci iloczynu sko\u0144czonego niemalejacego ciagu pewnych liczb pierwszych. Twierdzenie to by\u0142 w stanie udowodni\u0107 ju\u017c Euklides (stworzy\u0142 niezb\u0119dne narz\u0119dzia), ale uczyni\u0142 to dopiero <a href=\"http:\/\/pl.wikipedia.org\/wiki\/Carl_Friedrich_Gauss\">Gauss<\/a>. Twierdzenie to oznacza, \u017ce liczby pierwsze sa w pewnym sensie atomami, z kt\u00f3rych przy pomocy mno\u017cenia zbudowane sa pozosta\u0142e liczby.<\/p>\n<p><strong>Wyznaczanie liczb pierwszych<\/strong><\/p>\n<p>Do wyznaczania liczb pierwszych z danego przedzia\u0142u, najcz\u0119\u009cciej u\u017cywany jest algorytm <a href=\"http:\/\/pl.wikipedia.org\/wiki\/Sito_Eratostenesa\">sito Eratostenesa<\/a>, kt\u00f3ry polega na wykre\u009claniu ze zbioru liczbowego wszystkich wielokrotno\u009cci wcze\u009cniejszych liczb.<\/p>\n<p>Opis: Wprowadzamy n, okre\u009clajaca nam przedzia\u0142 liczbowy z jakiego b\u0119dziemy wyznaczali liczby pierwsze. Tworzymy tablic\u0119 n-elementowa(t[n]), w kt\u00f3rej ka\u017cdy element ma przypisana warto\u009c\u0107 0. Tworzymy p\u0119tl\u0119 kt\u00f3ra sprawdzi liczby od 2 do pierwiastka z n(for(int i=2; i*i&lt;=n;i++)). W \u009crodku tej p\u0119tli tworzymy kolejna p\u0119tl\u0119, kt\u00f3ra \u2018wykre\u009cla\u2019 wielokrotno\u009cci liczby i ze zbioru, zmieniajac ich warto\u009c\u0107 na 1(t[i]=1). Wszystkie liczby z tablicy z warto\u009ccia 0, sa pierwszymi.<\/p>\n<p>Kod:<\/p>\n<p>#include &lt;iostream&gt;<\/p>\n<p>using namespace std;<\/p>\n<p>int n;<\/p>\n<p>int main()<\/p>\n<p>{<\/p>\n<p>cin&gt;&gt;n;<\/p>\n<p>int t[n+1];<\/p>\n<p>for (int i = 2; i*i &lt;= n; i++ )<\/p>\n<p>{<\/p>\n<p>if (t[i] == 1)<\/p>\n<p>continue; \/\/ je\u017celi dana liczb\u00a0 jest wykre\u009clona<\/p>\n<p>for (int j = 2 * i ; j &lt;= n; j += i) \/\/{\/\/ przejd\u009f od liczby 2 * i do n przesuwajac si\u0119 o i<\/p>\n<p>t[j] = 1;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>cout &lt;&lt; &#8222;Liczby pierwsze z przedzia\u0142u od 0 do &#8221; &lt;&lt; n &lt;&lt; &#8222;:&#8221; &lt;&lt; endl; \/\/wypisywanie liczb<\/p>\n<p>for (int i = 2; i &lt;= n; i++) {<\/p>\n<p>if (t[i] != 1)<\/p>\n<p>cout &lt;&lt; i &lt;&lt; endl;<\/p>\n<p>}<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<p>Innym algorytmem jest sito liniowe, polegajace na wykorzystaniu twierdzenia:<\/p>\n<p>Liczba z\u0142o\u017cona <em>x<\/em> mo\u017ce zosta\u0107 jednoznacznie zapisana jako:<\/p>\n<p><em>x<\/em> = <em>p<sup>k<\/sup><\/em> \u00d7<em> q<\/em><\/p>\n<table>\n<tbody>\n<tr>\n<td>gdzie::<\/td>\n<td>\u00a0<em>p<\/em> jest najmniejsza liczba pierwsza dzielaca <em>x<\/em> parzy\u009ccie,<br \/>\n<em>k<\/em> \u2265 1,<br \/>\n<em>p<\/em> = <em>q<\/em> lub <em>p<\/em> jest mniejsze od najmniejszej liczby pierwszej, kt\u00f3ra dzieli <em>q<\/em> parzy\u009ccie<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Zasada dzia\u0142ania algorytmu sita liniowego jest nast\u0119pujaca: Za <em>p<\/em> i <em>q<\/em> przyjmujemy pierwsza liczb\u0119 zbioru. Za <em>k<\/em> przyjmujemy 1. Nast\u0119pnie w p\u0119tli generujemy liczby <em>x<\/em> = <em>p<sup>k<\/sup><\/em> \u00d7 <em>q<\/em> dla kolejnych <em>k<\/em> = 1,2,&#8230; do momentu, gdy <em>x<\/em> przekroczy <em>n<\/em>. Wygenerowane liczby <em>x<\/em> usuwamy ze zbioru. Wtedy za <em>q<\/em> przyjmujemy nast\u0119pna liczb\u0119 w zbiorze i ca\u0142o\u009c\u0107 powtarzamy. Je\u009cli pierwsze <em>x<\/em>, dla <em>k<\/em> = 1 wykracza poza <em>n<\/em>, to zmieniamy <em>p<\/em> i <em>q<\/em> na nast\u0119pna liczb\u0119, kt\u00f3ra ze zbioru <strong><em>S<\/em><\/strong> nie zosta\u0142a jeszcze wyrzucona. Algorytm ko\u0144czymy, je\u009cli iloczyn <em>p<\/em> \u00d7 <em>q<\/em> wykracza poza <em>n<\/em>. Z przedstawionej tablicy wynika jasno, i\u017c ka\u017cde <em>x<\/em> pojawia si\u0119 tylko jeden raz, nie dochodzi wi\u0119c do zb\u0119dnych przebieg\u00f3w. Kod:<\/p>\n<p>#include &lt;iostream&gt;<\/p>\n<p>using namespace std;<\/p>\n<p>int main()<\/p>\n<p>{<\/p>\n<p>int i,n,p,q,x;<\/p>\n<p>cin &gt;&gt; n;<\/p>\n<p>int S[n+1];<\/p>\n<p>for(i = 2; i &lt;= n; i++) S[i] = 1;<\/p>\n<p>p = 2;<\/p>\n<p>while(p * p &lt;= n)<\/p>\n<p>{<\/p>\n<p>q = p;<\/p>\n<p>while(p * q &lt;= n)<\/p>\n<p>{<\/p>\n<p>x = p * q;<\/p>\n<p>while(x &lt;= n)<\/p>\n<p>{<\/p>\n<p>S[x] = 0;<\/p>\n<p>x *= p;<\/p>\n<p>}<\/p>\n<p>while(!S[++q]);<\/p>\n<p>}<\/p>\n<p>while(!S[++p]);<\/p>\n<p>}<\/p>\n<p>for(i = 2; i &lt;= n; i++) if(S[i]==1) cout &lt;&lt; i &lt;&lt; &#8221; &#8222;;<\/p>\n<p>cout &lt;&lt; endl;<\/p>\n<p>system(&#8222;pause&#8221;);<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<p>Tak\u017ce ja sam przygotowa\u0142em sw\u00f3j algorytm wyszukujacy liczby pierwsze. Sprawdza on czy dana liczba jest podzielna przez jakakolwiek liczb\u0119 pierwsza mniejsza od niej samej.<\/p>\n<p>Polega on na tym \u017ce tablica tp, przechowuje nam kolejne liczby pierwsze, kt\u00f3re znajdujemy. Na poczatku przechowuje jedynie liczb\u0119 2. Nast\u0119pnie w p\u0119tli sprawdza, czy dana liczba jest podzielna przez jakakolwiek liczb\u0119 z tablicy tp, je\u009cli tak to przechodzi dalej, je\u009cli nie to dopisuje ta liczb\u0119 jako kolejny element tablicy tp. Kod:<\/p>\n<p>#include &lt;iostream&gt;<\/p>\n<p>using namespace std;<\/p>\n<p>int n, tp[1000000], a=2, czyp;<\/p>\n<p>int main()<\/p>\n<p>{<\/p>\n<p>tp[0]=1;<\/p>\n<p>tp[1]=2;<\/p>\n<p>cin &gt;&gt; n;<\/p>\n<p>for(int i=3; i&lt; n;i++)<\/p>\n<p>{<\/p>\n<p>for(int j=1;j&lt;a;j++)<\/p>\n<p>{<\/p>\n<p>if(i%tp[j]==0)<\/p>\n<p>{<\/p>\n<p>czyp=1;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>if (czyp==0)<\/p>\n<p>{<\/p>\n<p>tp[a]=i;<\/p>\n<p>a++;<\/p>\n<p>}<\/p>\n<p>czyp=0;<\/p>\n<p>}<\/p>\n<p>for(int i = 0; i &lt; a; i++) cout &lt;&lt; tp[i] &lt;&lt; &#8221; &#8222;;<\/p>\n<p>cout &lt;&lt; endl;<\/p>\n<p>&nbsp;<\/p>\n<p>system(&#8222;pause&#8221;);<\/p>\n<p>return 0;<\/p>\n<p>}<\/p>\n<p>Postanowi\u0142em sprawdzi\u0107 szybko\u009c\u0107 dzia\u0142ania tych trzech algorytm\u00f3w, dla wyszukania liczb pierwszych z r\u00f3\u017cnych zakres\u00f3w, oto wyniki:<\/p>\n<p>Dla n=1000:<\/p>\n<p>Sito <a href=\"http:\/\/edu.i-lo.tarnow.pl\/inf\/alg\/001_search\/0011.php\">Eratostenesa<\/a>: 16ms<\/p>\n<p>Sito liniowe: 16ms<\/p>\n<p>M\u00f3j algorytm: 16ms<\/p>\n<p>Wyniki identyczne, czyli algorytmy radza sobie r\u00f3wnie dobrze dla niewielkich liczb.<\/p>\n<p>Dla n=10000:<\/p>\n<p>Sito <a href=\"http:\/\/edu.i-lo.tarnow.pl\/inf\/alg\/001_search\/0011.php\">Eratostenesa<\/a>: 110ms<\/p>\n<p>Sito liniowe: 78ms<\/p>\n<p>M\u00f3j algorytm: 265ms<\/p>\n<p>Tutaj ju\u017c wida\u0107 jak m\u00f3j algorytm odstaje wydajno\u009ccia od reszty, czego oczywi\u009ccie mo\u017cna by\u0142o si\u0119 spodziewa\u0107, po niskim stopniu skomplikowania.<\/p>\n<p>Dla n=100000<\/p>\n<p>Sito <a href=\"http:\/\/edu.i-lo.tarnow.pl\/inf\/alg\/001_search\/0011.php\">Eratostenesa<\/a>: 766-781ms<\/p>\n<p>Sito liniowe: 656-672ms<\/p>\n<p>M\u00f3j algorytm: ~14000ms<\/p>\n<p>Jak wida\u0107 algorytm, kt\u00f3ry sam opracowa\u0142em ju\u017c mocno odstaje od reszty. Przy du\u017cych liczbach lepiej u\u017cywa\u0107 algorytm\u00f3w sprawdzonych. Jedyne co mnie zaciekawi\u0142o, to to \u017ce Sito liniowe jest nieco bardziej wydajne od sita Eratostenesa, a mimo to jest mniej znane i rzadziej u\u017cywane.<\/p>\n<p>Praca ta to wynik moich bada\u0144, na temat liczb pierwszych, kt\u00f3re przeprowadza\u0142em w ramach projektu <strong>\u201eRegionalny program stypendialny dla uczni\u00f3w szczeg\u00f3lnie uzdolnionych\u201d<\/strong><\/p>\n<p>Grzegorz Lewczuk<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prezentacja Grzegorza Lewczuka<\/p><p><a class=\"more-link btn\" href=\"https:\/\/lolosice.edu.pl\/?p=315\">Czytaj dalej<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[35],"tags":[],"class_list":["post-315","post","type-post","status-publish","format-standard","hentry","category-prez-styp","nodate","item-wrap"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=\/wp\/v2\/posts\/315","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=315"}],"version-history":[{"count":1,"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=\/wp\/v2\/posts\/315\/revisions"}],"predecessor-version":[{"id":316,"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=\/wp\/v2\/posts\/315\/revisions\/316"}],"wp:attachment":[{"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lolosice.edu.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}