Matematyka dyskretna 1/Wykład 11: Teoria liczb II: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Arek (dyskusja | edycje)
Nie podano opisu zmian
 
Arek (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
{thm}{Twierdzenie}
{obs}[thm]{Obserwacja}
{con}[thm]{Wniosek}
{lemat}{Lemat}
{article}
{../makraP}
'''TEORIA LICZB II'''
{}
{}
==Arytmetyka modularna==
==Arytmetyka modularna==


Linia 367: Linia 354:
Pozostaje policzyć <math>x</math>:
Pozostaje policzyć <math>x</math>:


<center><math>\aligned x&=&2\cdot2\cdot770+7\cdot1\cdot231+10\cdot1\cdot210+1\cdot1\cdot330\\
<center><math>\aligned x&=2\cdot2\cdot770+7\cdot1\cdot231+10\cdot1\cdot210+1\cdot1\cdot330\\
&=&3080+1617+2100+330\\
&=3080+1617+2100+330\\
&=&7127\equiv_{2310} 197.
&=7127\equiv_{2310} 197.
\endaligned</math></center>
\endaligned</math></center>


Linia 402: Linia 389:
Pozostaje nam obliczenie <math>x</math>:
Pozostaje nam obliczenie <math>x</math>:


<center><math>\aligned x&=&0\cdot1\cdot195+12\cdot10\cdot30+2\cdot26\cdot11=4172\equiv_{390}=272.
<center><math>\aligned x&=0\cdot1\cdot195+12\cdot10\cdot30+2\cdot26\cdot11=4172\equiv_{390}=272.
\endaligned</math></center>
\endaligned</math></center>


Linia 821: Linia 808:


<center><math>\aligned \varphi(n)
<center><math>\aligned \varphi(n)
&=&\varphi(p_1^{\alpha_1})\ldots\varphi(p_k^{\alpha_k})\\
&=\varphi(p_1^{\alpha_1})\ldots\varphi(p_k^{\alpha_k})\\
&=&p_1^{\alpha_1}\left(1-\frac{1}{p_1}\right)p_2^{\alpha_2}\left(1-\frac{1}{p_2}\right)\ldots p_k^{\alpha_k}\left(1-\frac{1}{p_k}\right)\\
&=p_1^{\alpha_1}\left(1-\frac{1}{p_1}\right)p_2^{\alpha_2}\left(1-\frac{1}{p_2}\right)\ldots p_k^{\alpha_k}\left(1-\frac{1}{p_k}\right)\\
&=&n\cdot\prod_{p|n}\left(1-\frac{1}{p}\right),
&=n\cdot\prod_{p|n}\left(1-\frac{1}{p}\right),
\endaligned</math></center>
\endaligned</math></center>


Linia 964: Linia 951:
Teraz łatwo już policzyć
Teraz łatwo już policzyć


<center><math>\aligned \varphi(n)&=&n-\alpha_1+\alpha_2-\alpha_3+\ldots+(-1)^k\alpha_k\\
<center><math>\aligned \varphi(n)&=n-\alpha_1+\alpha_2-\alpha_3+\ldots+(-1)^k\alpha_k\\
&=&n-n(\frac{1}{p_1}+\frac{1}{p_2}+\ldots+\frac{1}{p_k})+n(\frac{1}{p_1p_2}+\frac{1}{p_1p_3}+\ldots)-\ldots\\
&=n-n(\frac{1}{p_1}+\frac{1}{p_2}+\ldots+\frac{1}{p_k})+n(\frac{1}{p_1p_2}+\frac{1}{p_1p_3}+\ldots)-\ldots\\
&&\ldots+n(-1)^k\frac{1}{p_1\cdot\ldots\cdot p_k}\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad(*)\\
&&\ldots+n(-1)^k\frac{1}{p_1\cdot\ldots\cdot p_k}\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad(*)\\
&=&n(1-\frac{1}{p_1})\cdot\ldots\cdot(1-\frac{1}{p_k}).
&=n(1-\frac{1}{p_1})\cdot\ldots\cdot(1-\frac{1}{p_k}).
\endaligned</math></center>
\endaligned</math></center>


Linia 1046: Linia 1033:


<center><math>\aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right)
<center><math>\aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right)
&=&\sum_{d|n} \mu(d)\sum_{c|\frac{n}{d}}g(c)\\
&=\sum_{d|n} \mu(d)\sum_{c|\frac{n}{d}}g(c)\\
&=&\sum_{d|n,c|\frac{n}{d}} \mu(d)g(c).
&=\sum_{d|n,c|\frac{n}{d}} \mu(d)g(c).
\endaligned</math></center>
\endaligned</math></center>


Linia 1054: Linia 1041:


<center><math>\aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right)
<center><math>\aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right)
&=&\sum_{c|n,d|\frac{n}{c}}\mu(d)g(c)\\
&=\sum_{c|n,d|\frac{n}{c}}\mu(d)g(c)\\
&=&\sum_{c|n}g(c)\sum_{d|\frac{n}{c}}\mu(d).
&=\sum_{c|n}g(c)\sum_{d|\frac{n}{c}}\mu(d).
\endaligned</math></center>
\endaligned</math></center>


Linia 1064: Linia 1051:


<center><math>\aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right)
<center><math>\aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right)
&=&\sum_{c|n}g(c)\sum_{d|\frac{n}{c}}\mu(d)\\
&=\sum_{c|n}g(c)\sum_{d|\frac{n}{c}}\mu(d)\\
&=&g(n)\sum_{d|1}\mu(d)=g(n)\mu(1)=g(n).
&=g(n)\sum_{d|1}\mu(d)=g(n)\mu(1)=g(n).
\endaligned</math></center>
\endaligned</math></center>



Wersja z 07:51, 22 sie 2006

Arytmetyka modularna

Liczby przystające modulo n>0 to takie dwie liczby a,b, dla których różnica ab jest wielokrotnością n. Fakt ten zapisujemy jako a nb. Innymi słowy, a nb jeśli a i b mają te same reszty w dzieleniu przez n.

Obserwacja

Dla dowolnych a,b,c oraz n>0 zachodzi:

  • a na,
  • a nb wtedy i tylko wtedy, gdy b na,
  • jeśli a nb i b nc to a nc.

Powyższe własności świadczą o tym, że przystawanie n modulo n jest relacją równoważności na zbiorze . Dlatego czasem relacja ta nazywana jest równością modulo n. Okazuje się też, że relacja n jest zgodna z działaniami arytmetycznymi: dodawania, odejmowania i mnożenia, a więc jest kongruencją ze względu na te działania.

Obserwacja

Dla dowolnych a,b,c,d oraz n>0 mamy:

  • jeśli a nb i c nd, to a+c nb+d,
  • jeśli a nb i c nd, to ac nbd,
  • jeśli a nb i c nd, to ac nbd.

Podane w dwu poprzednich obserwacjach własności relacji równości modulo n pozwalają na wprowadzenie działań w zbiorze ilorazowym /n, tzn. w zbiorze klas równoważności. {[a]n:a}, poprzez:

  • [a]n+[b]n=[a+b]n,
  • [a]n[b]n=[ab]n,
  • [a]n[b]n=[ab]n,

Ponieważ w każdej klasie [a]n jest jakaś liczba spośród 0,1,2,,n1, a mianowicie reszta z dzielenia liczby a przez n, to wygodniej jest po prostu mówić o arytmetyce (modularnej) na zbiorze tych reszt {0,1,2,,n1} i pisać np.:

  • 3+5 62,
  • 35 64,
  • 35 63.

Tak więc, dla n>0 możemy zidentyfikować zbiór ilorazowy /n ze zbiorem n={0,n1} reszt modulo n. Po wprowadzeniu do tego zbioru działań arytmetycznych dostajemy pierścień, przemienny z jedynką n=({0,n1},+,). Pierścień ten nie zawsze jest jednak ciałem. Istotnie, nie zawsze możemy skracać w mnożeniu czynnik zachowując kongruencję. Dla przykładu: 22=4 610=25, ale 265. Okazuje się, że w równości modulo n możemy skracać czynniki względnie pierwsze z n.

Obserwacja Reguła skracania

Dla n>0, jeśli ad nbd i dn, to a nb.

Dowód

Ponieważ Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(d,n)=1} , rozszerzony algorytm Euklidesa gwarantuje istnienie x,y takich, że xd+yn=1, czyli dx n1. Mnożąc teraz obie strony ad nbd przez x, otrzymujemy adx nbdx, czyli a=a1nadxnbdxnb1=b.

Przykład

  • 15=357105=50 oraz 57 implikuje 3710,
  • 8=2332 oraz 23 implikuje 4=2231.

Chcąc móc skracać w pierscieniu n dowolne niezerowe czynniki wymagamy, by wszystkie liczby 1,2,,n1 były względnie pierwsze z n. To nic innego, jak wymaganie, by n było liczbą pierwszą.

Obserwacja

Pierścień n=({0,n1},+,) jest ciałem, wtedy i tylko wtedy, gdy n jest liczba pierwszą.

Rozwiązywanie równań modularnych

Oczywiście w ciele, każde równanie postaci ax=b ma dokładnie jedno rozwiązanie x, o ile a0. Zobaczmy czy są, jak wyglądają i jak otrzymać rozwiązania x równania modularnego postaci axnb w liczbach całkowitych x, gdzie a,b oraz a0.

Obserwacja

Dla a,b,a0 rozwiązania równania modularnego z jedną niewiadomą x:

ax nb,

zależą od wielkości Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,n)=1} w następujący sposób:

  • jeśli Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,n)=1} ,

to istnieje nieskończenie wiele rozwiązań; wszystkie one są postaci x=x0+kn, gdzie 0x0<n jest jakimś rozwiązaniem, a k,

  • jeśli Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,n)=d>1} ,

to równanie ma rozwiązanie wtedy i tylko wtedy, gdy również d|b. W tym przypadku rozwiązania równania ax nb pokrywają się z rozwiązaniami równania adx ndbd.

Ponadto,

  • ponadto, jeśli 0a,b<n, to rozwiązanie 0x0<n

równania ax nb, lub jego brak, można wskazać wykonując O(lg3n) operacji bitowych.

Dowód

Zauważmy najpierw, że jeśli a,b są resztami z dzielenia odpowiednio a i b przez n, to rozwiązania równań ax nb i ax nb są takie same. Istotnie, wynika to natychmiast z tego, że ax nax oraz b nb. Możemy więc przyjąć, że 0a,b<n. Ponadto odnotujmy, że z tych samych powodów, jeśli x0 spełnia równanie, to spełnia je również każda liczba postaci x0+kn, gdzie k.

Załóżmy najpierw, że Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,n)=1} . Rozszerzony algorytm Euklidesa gwarantuje istnienie y,z takich, że 1 nya+znnya. Łatwo teraz sprawdzić, że reszta x0 z dzielenia yb przez n jest rozwiązaniem. A więc i wszystkie liczby postaci x0+kn, są również rozwiązaniami. Pozostaje pokazać, że wszystkie rozwiązania są takiej właśnie postaci. Niech więc axnbnax0. Ponieważ an, to a możemy skrócić otrzymując x nx0, co implikuje że x=x0+kn, dla pewnej liczby całkowitej k.

Niech teraz Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,n)=d>1} . Najpierw pokażemy, że jeśli równanie ax nb ma rozwiązanie, to d|b. Rzeczywiście, jeśli ax0 nb dla pewnego x0, to n|axb, a więc i d|axb. Ale d|a, więc d|b. Na odwrót, gdy d|b, to liczby a,b,n są podzielne przez n. Niech więc a=a/d, b=b/d i n=n/d. Wtedy Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a',n')=1} i, na mocy pierwszego punktu, równanie ax nb ma nieskończenie wiele rozwiązań. Pozostaje pokazać, że są to te same rozwiązania, co dla równania ax nb. Niech więc n|axb. Wtedy n=dn|d(axb)=axb. Gdy zaś ax nb, to ax=b+kn dla pewnego k. A zatem dax=db+kdn i, po wydzieleniu przez d>1, dostajemy ax=b+kn, czyli ax nb.

Na podstawie dowodu poprzednich dwu punktów wiemy więc, że by rozwiązać równanie ax nb wystarczy:

  • policzyć Parser nie mógł rozpoznać (błąd składni): {\displaystyle d:=\mbox{\sf NWD}(a,n)} oraz współczynniki y,z takie, że ya+zn=d,
  • jeśli d=1, to Parser nie mógł rozpoznać (błąd składni): {\displaystyle x_0 =yb \mbox{ {\sf mod} } n } jest poszukiwanym rozwiązaniem,
  • jeśli d>1 i d|b, to równanie nie posiada rozwiązań,
  • jeśli d>1 i d|b, to ybd jest szukanym rozwiązaniem.

W pierwszym punkcie rozszerzony algorytm Euklidesa pracuje w czasie O(lg3n), bo a,b<n. W kolejnych punktach wykonywane są jedynie podstawowe operacje arytmetyczne, a więc wykonywanych jest O(lg2n) operacji bitowych. Podsumowując, aby znaleźć rozwiązanie rozważanego równania (bądź stwierdzić ich brak) wystarczy O(lg3n) operacji bitowych.

Wniosek

Jeśli p jest liczbą pierwszą, to równania postaci ax pb dla dowolnych 0<a<p i 0b<p zawsze mają rozwiązanie i można je znaleźć wykonując O(lg3p) operacji bitowych.

Przykład

Rozwiążemy równanie 3x74.

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(3,7)=1} , czyli równanie ma nieskończenie wiele rozwiązań,
  • 1=1723,

czyli zbiór rozwiązań to {24+7k:k}={7k1:k}.

A następnie równanie 3x124.

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(3,12)=3} , ale 3|4, czyli równanie nie ma rozwiązania.

Wreszcie rozważmy równanie 9x2112.

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(9,21)=3} oraz 3|12, czyli równanie ma nieskończenie wiele rozwiązań,
  • 3=12129,

czyli zbiór rozwiązań to {2123+213k:k}={13+7k:k}.

Czasem jedną kongruencję wygodnie jest zamienić na układ kongruencji wykorzystując następującą własność.

Obserwacja

Niech a,b,m,n, gdzie m,n>0 i mn. Wtedy a mnb jest równoważne temu, że równocześnie a mb i a nb.

Dowód

Jeśli a mnb, to mn|ab. A więc oczywiście m|ab i n|ab, co jest równoważne z a mb i a nb. Dla dowodu implikacji odwrotnej, że jest ona trywialna dla a=b i wobec tego przyjmijmy (bez straty ogólności), że a>b. Załóżmy też, że m|ab i n|ab. Ponieważ mn, to rozkłady liczb m i n nie mają wspólnych czynników pierwszych. Natomiast rozkład ab musi zawierać wszystkie liczby pierwsze z rozkładów m i n w odpowiednio wysokich potęgach. To dowodzi, iż mn|ab, czyli a mnb.

Poprzednia obserwacja prowadzi do twierdzenia powszechnie znanego jako Chińskie Twierdzenie o Resztach. Udowodnił je chiński matematyk Sun Tzu w III wieku n.e. ( nie mylić z Sun Tzu, myślicielem, filozofem, autorem Sztuki wojny).

Twierdzenie Chińskie twierdzenie o resztach

Niech n1,,nk{0} będą parami względnie pierwsze, tzn. ninj dla ij. Wtedy dla dowolnych a1,,ak istnieje dokładnie jedna liczba 0x<n1nk taka, że:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned x&\equiv_{n_1}&a_1,\nonumber \\ x&\equiv_{n_2}&a_2,\nonumber \\ &\vdots& \\ x&\equiv_{n_k}&a_k.\nonumber \endaligned}

Dowód

Niech N=n1nk. Dla liczby a rozważmy ciąg a=(a1,,ak) reszt z dzielenia a odpowiednio przez n1,,nk.

Niech teraz 0a<b<N. Gdyby a=b, to

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned a&\equiv_{n_1}&b,\\ a&\equiv_{n_2}&b,\\ &\vdots&\\ a&\equiv_{n_k}&b. \endaligned}

Z drugiej strony n1nini+1, więc stosując wielokrotnie Obserwację Uzupelnic obserwacja potrzebna do chinskiego twierdzenia o resztach| otrzymujemy i Nj, czyli N|ji, co jest niemożliwe wobec 0<ji<N. Sprzeczność ta pokazuje, że liczby ze zbioru {0,1,,N1} mają różne ciągi reszt. Oznacza to, że ciągów postaci a jest dokładnie N, czyli tyle ile wszystkich możliwych ciągów w n1××nk. Tym samym przyporządkowanie Naan1××nk jest bijekcją, co kończy dowód twierdzenia.

Chińskie Twierdzenie o Resztach podaje warunki wystarczające na istnienie rozwiązania układu równań modularnych (Uzupelnic chrt|). Nie podaje jednak metody jego uzyskania.

Konstrukcja rozwiązania.

Niech Nj=N/nj, czyli Nj jest iloczynem wszystkich ni poza nj. Oczywiście, Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(n_i,N_i)=1} . Rozszerzony algorytm Euklidesa pozwala więc znaleźć liczby xi takie, że Nixi ni1. Połóżmy

x=i=1kaixiNi.

Wtedy ni dzieli wszystkie czynniki sumy poza i-tym, ponieważ ni|Nj dla ji. A więc, dla dowolnego i mamy:

xniaixiNiniai1=ai.

To oznacza, że x jest rozwiązaniem układu równań modularnych (Uzupelnic chrt|).

Oszacujmy czas działania tego algorytmu. Niech l1,,lk będą długościami odpowiednio n1,,nk. Wtedy N ma długość co najwyżej l=l1++lk. Kroki algorytmu można wykonać kolejno w czasie:

  • O(kl) na wyliczenie wszystkich iloczynów postaci Ni

oraz całego iloczynu N,

  • O(kl3) na wyliczenie kolejnych współczynników xi, czyli

k-krotną aplikację rozszerzonego algorytmu Euklidesa dla liczb ni,NiN,

  • O(kl2) na obliczenie x, czyli O(k) mnożeń i dodawań.

Podsumowując wszystkie kroki zostaną wykonane w czasie O(klg3N).

Przykład

Rozważmy układ równań:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned x&\equiv_3& 2,\\ x&\equiv_{10}& 7,\\ x&\equiv_{11}& 10,\\ x&\equiv_7& 1. \endaligned}
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(3,10)=\mbox{\sf NWD}(3,11)=\mbox{\sf NWD}(3,7)=\mbox{\sf NWD}(10,11)=\mbox{\sf NWD}(10,7)=\mbox{\sf NWD}(11,7)=1} , czyli możemy zaaplikować Chińskie Twierdzenie o Resztach,
  • N=371011=2310,
  • N1=23103=770,
  • N2=231010=231,
  • N3=231011=210,
  • N4=23107=330.

Zgodnie z procedurą czterokrotnie używamy rozszerzonego algorytmu Euklidesa otrzymując x1,,x4:

  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(3,770)=1=257\cdot3-1\cdot770} , x1=132,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(10,231)=1=-23\cdot10+1\cdot231} , x2=1,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(11,210)=1=-19\cdot11+1\cdot210} , x3=1,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(7,330)=1=-47\cdot7+1\cdot330} , x4=1.

Pozostaje policzyć x:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned x&=2\cdot2\cdot770+7\cdot1\cdot231+10\cdot1\cdot210+1\cdot1\cdot330\\ &=3080+1617+2100+330\\ &=7127\equiv_{2310} 197. \endaligned}

A więc 197 jest najmniejszym dodatnim rozwiązaniem naszego układu równości.

Przykład

Rozważmy jeszcze jeden układ równań:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned x&\equiv_2&0,\\ x&\equiv_{13}&12,\\ x&\equiv_{15}&2. \endaligned}
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(2,13)=\mbox{\sf NWD}(2,15)=\mbox{\sf NWD}(13,15)=1} ,

czyli możemy zaaplikować Chińskie Twierdzenie o Resztach,

  • N=21315=390,
  • N1=3902=195,
  • N2=39013=30,
  • N3=39015=26,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(2,195)=1=-97\cdot2+1\cdot195} , x1=1,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(13,30)=1=7\cdot13-3\cdot30} , x2=31310,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(15,26)=1=7\cdot15-4\cdot26} , x3=41511.

Pozostaje nam obliczenie x:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned x&=0\cdot1\cdot195+12\cdot10\cdot30+2\cdot26\cdot11=4172\equiv_{390}=272. \endaligned}

Zatem 272 jest najmniejszym dodatnim rozwiązaniem naszego układu równań.

Potęgowanie modularne

Potęgowanie modularne.

Naszym celem jest policzenie

Parser nie mógł rozpoznać (błąd składni): {\displaystyle a^b \mbox{ {\sf mod} } n . }

Oczywiście, możemy założyć, że 0a<n, bo inaczej najpierw można policzyć resztę a z dzielenia a przez n, a dopiero potem Parser nie mógł rozpoznać (błąd składni): {\displaystyle (a')^b \mbox{ {\sf mod} } n } , jako że Parser nie mógł rozpoznać (błąd składni): {\displaystyle (a')^b \mbox{ {\sf mod} } n =a^b \mbox{ {\sf mod} } n } . Zauważmy, że w przeciwieństwie do zwykłego potęgowania wynik nigdy nie przekracza n, czyli nie rośnie wykładniczo w stosunku do a. Pozwala to żywić nadzieję na szybsze algorytmy potęgujące. Dla rozgrzewki przeanalizujmy najpierw naiwny sposób liczenia potęgi modulo:

  • Naiwne potęgowanie modulo.

Wymnóż a przez siebie b-krotnie, po każdym mnożeniu weź resztę modulo n. Branie reszty po każdym mnożeniu, utrzymuje tymczasowy iloczyn w zbiorze {0,,n1}. Zatem wykonywanych jest b mnożeń liczb O(logn)-bitowych, czyli wykonywanych jest O(blog2n) operacji bitowych. Jest to zatem algorytm działający w czasie wykładniczym względem rozmiaru wejścia O(logb+logn).

  • Szybkie potęgowanie modulo.

Niech b=(bk1b0)2 będzie binarnym zapisem liczby b. Zauważmy, że Parser nie mógł rozpoznać (błąd składni): {\displaystyle a^b \mbox{ {\sf mod} } n =\prod_{i=0}^{k-1}a^{b_i2^i} \mbox{ {\sf mod} } n } . Policzmy zatem w następujacy sposób kolejne potęgi a występujące w iloczynie:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned a\cdot a \mbox{ {\sf mod} } n &\equiv_n&a^2 \mbox{ {\sf mod} } n ,\\ (a^2 \mbox{ {\sf mod} } n )\cdot(a^2 \mbox{ {\sf mod} } n )&\equiv_n&a^4 \mbox{ {\sf mod} } n ,\\ &\ldots&\\ (a^{2^{k-2}} \mbox{ {\sf mod} } n )\cdot(a^{2^{k-2}} \mbox{ {\sf mod} } n )&\equiv_n&a^{2^{k-1}} \mbox{ {\sf mod} } n . \endaligned}

Tym sposobem wykonanych zostanie k2 mnożeń i dzieleń liczb O(logn)-bitowych, czyli O(klog2n) operacji bitowych. Aby otrzymać wynik musimy jeszcze wymnożyć przez siebie te potęgi, ktorym odpowiada bit 1 w liczbie b. Wykonanych zostanie więc jeszcze co najwyżej k mnożeń (które przeplatamy braniem reszty modulo n) liczb O(logn)-bitowych.

W sumie wykonanych zostanie O(klog2n)=O(logblog2n) operacji bitowych, a więc znacznie mniej niż sposobem naiwnym. Przedstawiony algorytm jest efektywny (wielomianowy względem długości wejścia).

Przykład

Parser nie mógł rozpoznać (błąd składni): {\displaystyle 7^{12} \mbox{ {\sf mod} } 10 =? }
  • 12=(1100)2,
  • wyznaczamy wybrane potęgi 7 modulo 10:
    • 72=49109,
    • 741099=81101,
    • 781011=1,
  • 712=78741011=1.
  • wykonane zostały tylko 4 mnożenia!

Przykład

Parser nie mógł rozpoznać (błąd składni): {\displaystyle 3^{51} \mbox{ {\sf mod} } 13 =? }
  • 51=(110011)2,
  • wyznaczamy wybrane potęgi 3 modulo 13:
    • 32=9,
    • 34=99=81133,
    • 381333=9,
    • 3161399=81133,
    • 3321333=9.
  • 351=3323163231139393=729131.

Małe Twierdzenia Fermata

Małego Twierdzenia Fermata. nie należy mylić z tzw. Wielkim Twierdzeniem Fermata, które frapowało matematyków przez wiele stuleci i zostało ostatecznie udowodnione przez Andrew Wiles'a w 1994 roku.

Zgodnie ze swoim zwyczajem, podobnie jak i w przypadku Wielkiego Twierdzenia, Fermat przedstawił Małe Twierdzenie, nie podając dowodu. List, w którym się po raz pierwszy pojawiła ta teza, później nazwana Małym Twierdzeniem Fermata, został napisany dnia 18.IX.1640. Fermat dodał komentarz: "Propozycja ta jest prawdziwa dla wszystkich liczb pierwszych; jej dowód prześlę Ci, jeśli nie będzie zbyt długi". Pierwszy znany dowód tego twierdzenia przedstawił Leibniz w 1683 roku.

Twierdzenie Małe Twierdzenie Fermata

Dla dowolnej p liczby pierwszej i dowolnego a zachodzi:

ap pa.

Dowód

Poznamy trzy różne dowody. Najpierw jednak zauważmy, że bez straty ogólności możemy przyjąć iż a{0,,p1}, gdyż w miejsce a możemy rozważać resztę z dzielenia a przez p. Ponadto, zwróćmy uwagę, iż dla a=0 teza jest oczywista, natomiast dla a{1,,p1} wystarczy udowodnić, że:

ap1 p1.

Pierwszy dowód. Dla a{1,,p1} rozważmy ciąg

a0,a1,a2,,ap1

reszt Parser nie mógł rozpoznać (błąd składni): {\displaystyle a_k = ka \mbox{ {\sf mod} } p } liczb ka modulo p. Pokażemy, że żadna wartość w tym ciągu się nie powtarza. Niech 0i<j<p i, dla dowodu niewprost, niech

ia pja.

Wtedy p|(ji)a. Ponieważ p jest liczba pierwszą to p|ji lub p|a. Ponieważ jednak obie liczby a oraz ji leżą w zbiorze {1,2,,p1}, żaden z tych dwu przypadków nie jest możliwy. A zatem {a0,a1,a2,,ap1}={0,1,2,,p1}. Oczywiście a0=0, więc iloczyny pozostałych elementów w tych dwu zbiorach muszą być równe, co daje:

a2a(p1)apa1a2ap1=12(p1),

lub inaczej:

(p1)!ap1p(p1)!.

Ponieważ p jest liczbą pierwszą, wszystkie liczby ze zbioru {1,,p1} są względnie pierwsze z p, więc i (p1)!p. Można więc zastosować regułę skracania:

ap1 p1.

Drugi dowód. Dla dowodu indukcyjnego względem a=0,1,2,,p1 zauważmy najpierw, że w oczywisty sposób 0p p0 oraz 1p p1 i załóżmy, że kp pk. Aby udowodnić, że:

(k+1)p pk+1

pokażemy znacznie mocniejszą równość

(x+y)p pxp+yp,

która przy x=k i y=1 pozwoli zakończyć dowód indukcyjny.

Rozwijając dwumian (x+y)p mamy:

(x+y)p=i=0p(pi)xiypi.

Współczynnik (pi)=p!i!(pi)! jest zawsze liczbą całkowitą. Ponadto, jeśli 0<i<p, to wszystkie czynniki obu silni mianownika są względnie pierwsze z p, bo p jest pierwsza, a czynniki te są mniejsze niż p. Oznacza to, iż w rozkładzie (pi) na czynniki pierwsze musi znaleźć się p. To zaś implikuje (pi) p0 dla 0<i<p. A więc

(x+y)p=i=0p(pi)xiypipi{0,p}(pi)xiypi=xp+yp.

Trzeci dowód. Niech a{1,,p1}. Rozważmy słowa długości p nad alfabetem a-elementowym.

Przykład

Niech p=7, a=3. Symbolami alfabetu niech będą A,B,C. Oto mocno skrócona lista 37=2187 wszystkich słów 7-literowych nad tym alfabetem.

{

Wszystkich takich słów jest ap. Pokażemy, że po usunięciu słów jednoliterowych, pozostałe apa słów będzie można podzielić na rozłączne p-elementowe grupy. To oczywiście natychmiast da p|apa, czyli pożądaną równość ap pa.

Słowo v nazwiemy przesunięciem cyklicznym słowa w=w1wk o i liter, jeśli

v=wi+1wi+2wkw1wi1wi.

Przykład

Przesunięcia cykliczne słowa CBAABCB:

{

Drugi przykład pokazuje, że niektóre przesuniecia cyklicze sa równe. W istocie mamy:

Lemat

Niech v będzie słowem, którego nie da się przedstawić jako ul=uu, dla żadnego słowa u i żadnej liczby l>0. Z kolei niech w=vk=vv, dla pewnego k>0. Wtedy słowo w ma dokładnie Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vertv\right\vert} różnych przesunięć cyklicznych.

Dowód

Oczywiście, jeśli liczba liter, o które różnią się dwa przesunięcia cykliczne jest wielokrotnością długousi słowa v, to te dwa przesunięcia dają to samo słowo. A zatem w ma co najwyżej Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vertv\right\vert} różnych przesunięć cyklicznych. Z drugiej strony, gdyby dwa przesunięcia cykliczne słowa v były równe, to dawałyby to samo słowo. Istotnie, gdy v=v1vm i v1,,vm są literami alfabetu, to każde przesunięcie cykliczne prowadzi do jednego ze słów z listy:

v1v2v3vmvk1,v2v3vmvk1v1,v3vmvk1v1v2,vmvk1v1vm1.

Ponieważ Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vertv\right\vert=m} , pozostaje pokazać, że słowa na tej liście sa różne. Dla dowodu niewprost, bez straty ogólności, możemy założyć, że:

v1vmvk1=vivmvk1v1v2vi1,

dla pewnego 1<im. Wtedy

v1vm=vivmv1vi1.

To z kolei prowadzi do ciągu równości w poniższym diagramie:

v1vm(i1)vm(i1)+1vm2(i1)vm2(i1)+1vm3(i1)vivmv1vm(i1)vm(i1)+1vm2(i1)

Czyli słowo v jest postaci v=xl dla x=vivm i l=mm(i1), wbrew założeniom lematu.

Wyposażeni w Lemat, możemy powrócić do trzeciego dowodu Małego Twierdzenia Fermata. Niech więc w będzie słowem, w którym występują dwie różne litery alfabetu. Słowo to nie może być postaci vl, gdzie l2, gdyż inaczej Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vertv\right\vert|p} , a skoro p jest liczbą pierwszą, to Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vertv\right\vert=1} lub Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vertv\right\vert=p=\left\vertw\right\vert} . W pierwszym przypadku w jest jednoliterowe, a w drugim v=w i l=1. A zatem każde z apa słów w ma dokładnie p różnych przesunięć cyklicznych. To dowodzi, iż p|apa, czyli ap pa.

W jednym z dalszych wykładów poznamy jeszcze jeden dowód Małego Twierdzenia Fermata, oparty na elementarnej wiedzy z teorii grup.

Potęgowanie modulo liczba pierwsza.

Wykorzystując Małe Twierdzenie Fermata możemy trochę poprawić szybkość potęgowania modularnego. Asymptotycznie jednak złożoność pozostanie taka sama. Zauważmy bowiem, że:

abpab,

gdzie b jest resztą z dzielenia b przez p1.

Przykład

Policzmy Parser nie mógł rozpoznać (błąd składni): {\displaystyle 7^{126} \mbox{ {\sf mod} } 11 } .

  • 11 jest liczba pierwszą, czyli możemy skorzystać z Małego Twierdzenia Fermata,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle 126 \mbox{ {\sf mod} } 10 =6} ,
  • 71261176,
  • 6=(110)2,
  • liczymy wybrane potęgi 7 modulo 11:
    • 72=49115,
    • 741155=25114.
  • 71271176=74721145=20119.
  • wykonaliśmy 3 mnożenia.

Twierdzenie Eulera

Poznamy teraz uogólnienie Małego Twierdzenia Fermata pochodzące od Eulera. Uogólnienie to leży u podstaw znanego systemu kryptograficznego -- RSA. Potrzebne nam będzie funkcja zliczające liczby względnie pierwsze z liczbą n.

Funkcja φ-Eulera to φ:{0} zdefiniowaną poprzez

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \varphi(n)=\left\vert{\left\{ {1\leq a<n\quad:\quad \mbox{\sf NWD}(a,n)=1} \right\} }\right\vert. }

Obserwacja

Dla dowolnej liczby pierwszej p zachodzi:

  • φ(p)=p1,
  • φ(pα)=pαpα1=pα(11p).

Dowód

Ponieważ p jest pierwsza, liczby 1,2,,p1 są z nią względnie pierwsze, co dowodzi pierwszego punktu. Dla dowodu punktu drugiego zauważmy najpierw, że jedynie wielokrotności liczby p mają nietrywialny wspólny dzielnik z pα. Wielokrotności tych w przedziale [1,pα] jest dokładnie pα1, stąd φ(pα)=pαpα1.

Obserwacja

Dla dowolnych m,n>0 takich, że mn zachodzi

φ(mn)=φ(m)φ(n).

Dowód

Z Chińskiego Twierdzenia o Resztach wiemy, iż każda liczba z przedziału [0,,mn1] jest jednoznacznie wyznaczona przez jej reszty modulo m i modulo n. Wiemy także, że dla dowolnego a:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,mn)=1} wtedy i tylko wtedy, gdy Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,m)=1=\mbox{\sf NWD}(a,n)} .

To oznacza, iż liczb 0a<mn takich, że amn jest dokładnie tyle co par (i1,i2) takich, że 0i1<m, 0i2<n oraz i1m, i2n.

Wniosek

Jeśli n=p1α1p2α2pkαk jest rozkładem na liczby pierwsze pi, w którym αi1, to:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned \varphi(n) &=\varphi(p_1^{\alpha_1})\ldots\varphi(p_k^{\alpha_k})\\ &=p_1^{\alpha_1}\left(1-\frac{1}{p_1}\right)p_2^{\alpha_2}\left(1-\frac{1}{p_2}\right)\ldots p_k^{\alpha_k}\left(1-\frac{1}{p_k}\right)\\ &=n\cdot\prod_{p|n}\left(1-\frac{1}{p}\right), \endaligned}

gdzie ostatnim iloczyn przebiega po wszystkich liczbach pierwszych p dzielących n.

Przykład

Policzmy φ(2006):

  • 2006=21759,
  • φ(2006)=2006(112)(1117)(1159)=928.

Oraz φ(1980):

  • 1980=2232511,
  • φ(1980)=1980(112)2(113)2(115)(1111)=480.

Twierdzenie Euler 1736

Dla dowolnych a,n, gdzie Parser nie mógł rozpoznać (błąd składni): {\displaystyle \mbox{\sf NWD}(a,n)=1} zachodzi:

aφ(n) n1.

Dowód

Zmodyfikujmy pierwszy z poznanych dowodów Małego Twierdzenia Fermata. Niech m1<m2<<mφ(n) będą wszystkimi liczbami względnie pierwszymi z n i niewiększymi od n. Rozważmy ciąg

a1,a2,,aφ(n)

reszt Parser nie mógł rozpoznać (błąd składni): {\displaystyle a_i = m_i a \mbox{ {\sf mod} } n } liczb mia modulo n. Pokażemy, że żadna wartość w tym ciągu się nie powtarza. Niech 1i<jφ(n) i, dla dowodu niewprost, niech

mia nmja.

Wtedy n|(mjmi)a, a ponieważ na, to n|mjmi, co jest niemożliwe wobec 0<mjmi<n.

Ponadto pokażmy, że każde ai jest względnie pierwsze z n. Załóżmy zatem, że d|ai oraz d|n. Ponieważ ai=miaqn dla pewnego q, to d|mia. Z drugiej strony d|n, nmi i na, co daje dm i da. A więc d=1, czyli w istocie ain.

Wiemy więc, że liczby a1,,aφ(n) przyjmują wszystkie wartości m1,,mφ(n) i każdą tylko raz. A zatem

m1am2amφ(n)ana1a2aφ(n)=m1m2mφ(n).

Ponieważ liczby m1,,mφ(n) są względnie pierwsze z n możemy zastosować regułę skracania, by dostać

aφ(m) n1.

Zastosowanie Twierdzenia Eulera do szybkiego potęgowania.

Twierdzenie Eulera, tak jak uprzednio Twierdzenie Fermata, możemy wykorzystać do przyspieszenia potęgowania modularnego. Wymaga to jednak, by podstawa potęgi była względnie pierwsza z modułem n. Jest to istotnie słabszy warunek, niż ten wymagany przez Małe Twierdzenie Fermata. Zwracamy jednak uwagę, że aby zastosować Twierdzenie Eulera musimy w szczególności znać wartość funkcji φ dla modułu n. Jak się przekonamy podczas poznawania algorytmu RSA, wartość φ(n) jest jednak jest tak trudna do policzenia, jak rozkład n na czynniki pierwsze.

Przykład

Spróbujmy policzyć Parser nie mógł rozpoznać (błąd składni): {\displaystyle 13^{101} \mbox{ {\sf mod} } 16 } .

  • 1316, czyli możemy skorzystać z Twierdzenia Eulera,
  • φ(16)=8,
  • Parser nie mógł rozpoznać (błąd składni): {\displaystyle 101 \mbox{ {\sf mod} } 8 =5} ,
  • 1310116135,
  • 5=(101)2,
  • liczymy wybrane potęgi 13 modulo 16:
    • 1311613,
    • 132161313=169169,
    • 1341699=81161.
  • 1310116135=13413116113=13.

Funkcja Mobiusa

Choć Wniosek Uzupelnic phi(n)| wyprowadziliśmy już bezpośrednio z Obserwacji Uzupelnic phi(p)| i Uzupelnic phi iloczynu|, na zakończenie tego wykładu przedstawimy jego alternatywny dowód. Metoda użyta w tym alternatywnym dowodzie będzie przydatna w kilku innych sytuacjach.

Dowód

Niech n=p1α1p2α2pkαk będzie rozkładem na liczby pierwsze pi, w którym αi1. Zdefiniujmy Ai jako zbiór wielokrotności liczby pi w {1,,n1}. Wtedy Parser nie mógł rozpoznać (błąd składni): {\displaystyle \varphi(n)=n-\left\vertA_1\cup\ldots\cup A_k\right\vert} . Korzystając z Zasady Włączania i Wyłączania otrzymujemy

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \varphi(n)=n-\left\vertA_1\cup\ldots\cup A_k\right\vert=n-\alpha_1+\alpha_2-\ldots+(-1)^k\alpha_k, }

gdzie Parser nie mógł rozpoznać (błąd składni): {\displaystyle \alpha_i=\sum_{1\leq j_1<\ldots<j_i\leq k}\left\vertA_{j_1}\cap\ldots\cap A_{j_i}\right\vert} . Zauważmy, że zbiór Aj1Aji składa się z wielokrotności liczby P=pj1pjk, czyli liczb P,2P,,(nP)P. Zatem Parser nie mógł rozpoznać (błąd składni): {\displaystyle \left\vertA_{j_1}\cap\ldots\cap A_{j_i}\right\vert=\frac{n}{P}=\frac{n}{p_{i_1}\cdot\ldots\cdot p_{j_i}}} , skąd

αi=1j1<<jiknpj1pji=n1j1<<jik1pj1pji.

Teraz łatwo już policzyć

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned \varphi(n)&=n-\alpha_1+\alpha_2-\alpha_3+\ldots+(-1)^k\alpha_k\\ &=n-n(\frac{1}{p_1}+\frac{1}{p_2}+\ldots+\frac{1}{p_k})+n(\frac{1}{p_1p_2}+\frac{1}{p_1p_3}+\ldots)-\ldots\\ &&\ldots+n(-1)^k\frac{1}{p_1\cdot\ldots\cdot p_k}\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad(*)\\ &=n(1-\frac{1}{p_1})\cdot\ldots\cdot(1-\frac{1}{p_k}). \endaligned}

Przyjrzyjmy się temu dowodowi trochę dokładniej. Analizując ostatnią sumę dla n=60=2235 mamy

φ(60)=601(602+603+605)+(606+6010+6015)6030.

Po prawej stronie mamy naprzemienną sumę składników nd, gdzie d przebiega kolejne dzielniki liczby n, będące iloczynem różnych liczb pierwszych. Czynnik jest dodawany, jeśli d jest iloczynem parzystej liczby liczb pierwszych i odejmowany, jeśli d jest iloczynem nieparzystej liczby liczb pierwszych. Zależność tę możemy ogólniej zapisać w postaci

φ(n)=d|nμ(d)nd,

gdzie μ(d) zadana jest przez:

Parser nie mógł rozpoznać (nieznana funkcja „\begin{array}”): {\displaystyle \mu(d)= \left\{\begin{array} {cl} 1,&\textrm{jeśli } d=1Parser nie mógł rozpoznać (błąd składni): {\displaystyle ,}\\ (-1)^k,&\textrm{jeśli } djestiloczynemkParser nie mógł rozpoznać (błąd składni): {\displaystyle różnych liczb pierwszych,}\\ 0,&\textrm{jeśli w rozkładzie } dParser nie mógł rozpoznać (błąd składni): {\displaystyle któryś z czynników się powtarza.} \end{array} \right. }

Funkcja μ(d) jest znana jako funkcja Mobiusa, na cześć niemieckiego matematyka Augusta Ferdynanda Mobiusa, który jako pierwszy użył jej w 1831 roku. Funkcja Mobiusa pojawia się nieoczekiwanie w wielu rozważaniach Matematyki Dyskretnej. Pojawi się też i u nas w wykładach poświęconych teorii grup i teorii ciał.

Obserwacja

Dla dowolnego n2 mamy d|nμ(d)=0.

Dowód

Niech n=p1α1pkα. Wtedy każdy dzielnik d liczby n ma rozkład d=p1β1pkβk, gdzie 0βiαi. Jeśli choć jedno βi>1, to μ(d)=0. Rozważmy więc tylko te dzielniki dla których βi{0,1}. Każdy taki dzielnik wyznacza jednoznacznie pewien podzbiór zbioru {1,,k}, przy czym wartościom d, dla których μ(d)=1 odpowiadają podzbiory o parzystej liczbie elementów, a wartościom d, dla których μ(d)=1 odpowiadają podzbiory o nieparzystej liczbie elementów. A zatem:

d|nμ(d)=1(k1)+(k2)+(1)k(kk)=0.

Obserwacja wzór inwersyjny Mobiusa

Dla dowolnych funkcji f,g:, jeśli f(n)=d|ng(d), to g(n)=d|nμ(d)f(nd).

Dowód

Ponieważ

f(n)=d|ng(d),

to

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right) &=\sum_{d|n} \mu(d)\sum_{c|\frac{n}{d}}g(c)\\ &=\sum_{d|n,c|\frac{n}{d}} \mu(d)g(c). \endaligned}

Zauważmy, iż {(c,d):d|n,c|nd}={(c,d):c|n,d|nc}. Zatem

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right) &=\sum_{c|n,d|\frac{n}{c}}\mu(d)g(c)\\ &=\sum_{c|n}g(c)\sum_{d|\frac{n}{c}}\mu(d). \endaligned}

Z Obserwacji Uzupelnic obserwacja - suma naprzemienna mu| wiemy, że wewnętrze sumy zerują się dla wszystkich nc2. Zatem jedyny interesujący składnik zewnętrznej sumy dostajemy przy c=n:

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \aligned \sum_{d|n} \mu(d) f\left(\frac{n}{d}\right) &=\sum_{c|n}g(c)\sum_{d|\frac{n}{c}}\mu(d)\\ &=g(n)\sum_{d|1}\mu(d)=g(n)\mu(1)=g(n). \endaligned}

Jako ćwiczenie pozostawiamy użycie wzoru inwersyjnego Mobiusa do wyprowadzenia następującego wniosku:

Wniosek

d|nφ(d)=n.