170 likes | 406 Views
c = 0 for j = 0 … n sum(j) = A(j) + B(j) + c if sum(j) > 1 sum(j) = sum(j)-2 c = 1 else c = 0. קלט: מספרים טבעיים A, B. פלט : A+B , A-B , A*B, A/B( חלק שלם ושארית ). הערה : הקלט/פלט הינו כמערך של ביטים. זמן ריצה פולינומיאלי באןרך הקלט !.
E N D
c = 0 for j = 0 … n sum(j) = A(j) + B(j) + c if sum(j) > 1 sum(j) = sum(j)-2 c = 1 else c = 0 קלט: מספרים טבעייםA, B. פלט:A+B, A-B, A*B, A/B(חלק שלם ושארית). הערה:הקלט/פלטהינו כמערך של ביטים. זמן ריצהפולינומיאלי באןרךהקלט! אלגוריתמים עם מספרים טבעיים
A*B: Pl = Al*Bl Ph = Ah*Bh T = (Al + Ah) * (Bl + Bh) Pm = T - Pl - Ph retrun Pl + (Pm << n/2) + + (Ph << n) T(n) = 3T(n/2)+O(n) = O(n^1.59..) Ah Al Bh Bl |----|----| * |----|----| = |--------| Al*Bl + |--------| Al*Bh + |--------| Ah*Bl + |--------| Ah*Bh אלגוריתם מהיר לכפל
GCD(A,B): if A<B swap(A,B) if B=0 return A C = A mod B return GCD(B, C) קלט: A, B פלט: מחלק משותף מקסימאליK. תזכורת:GCD(A,B) = K אםם: (1) K|A, K|B (2) L|A, L|B ==> L|K מחלק משותף מקסימאלי
EGCD(A,B): if A<B swap(A,B) if B=0 return (1,0) //GCD=A C = A mod B D = A div B // C+DB=A (K,L)=EGCD(C,B) Return (K, L-DK) למה: קיימים שלמיםK,L כך ש: KA+LB=GCD(A,B) בעית ממממ (EGCD): קלט:A,B פלט:K,L ממממורחב
power(A,B): if B=0 return 1 C = power(A, B>>1) if B[0]=0 // B even return C*C else retrun C*C*A קלט:A, B פלט:A בחזקתB הערה: אורך התוצאה הוא בערךnB=n*2^n. זמן ריצה: פעולות כפל פעולות ביטים 2^O(n) O(n) חישוב חזקות
אם (A/B mod N)מוגדר אזי הוא ניתן לחישוב ע”י (K,L)=EGCD(B,N) A/B=(AK) (mod N) (A^B mod N) ניתן לחישוב יעיל ע”י האלגוריתם הקודם (תוך לקיחת שארית כל שלב). הגדרה:חוג השארית ZN = (0,1, … , N-1) חבור וכפל מוגדריםמודולוN. חילוקA/B מוגדראםם GCD(B,N)|A N ראשוני ==> ZN שדה. קל לחשב: חיבור, חיסור, כפל חשבון בחוגי שארית
משפט המספרים הראשוניים: מספר הראשוניים הקטנים מ-N הינו “בערך” N/(ln N) למה: אםp, q ראשוניים p|N, q|N ==> pq | N תזכורת: מספרים ראשוניים
אלגוריתם הסתברותי בחר ראשוני מקריP מתוך כל הראשוניים הקטנים מ-M (M=10^1000*N*n^2) חשב, מודולוP, את X=A^N, Y=B^N, Z=C^N בדוק האם X + Y = Z (mod P) ענה זאת כתשובה השערה: (עבור טבעיים) A^N+B^N=C^N ==> N=2 בעיה אלגוריתמית קלט:A, B, C, N פלט:האםA^N+B^N=C^N ? (כיום ההשערה היא כבר משפט -- אבל נניח שאיננו יודעים זאת) השערת פרמה
הוכחת 2: נסמן R = A^N + B^N - C^N מספר הראשוניים המחלקים אתR הינולכל היותר log_2 R < Nn מספר הראשוניים הקטנים מ-M הינו בערך M/lnM > Nn*10^999 משפט: (1) אם A^N+ B^N=C^N אזי האלגוריתם עונה “כן” (2) אם A^N + B^N <> C^N אזי ההסתברות שהאלגוריתם עונה “כן” < 999-^10 נכונות האלגוריתם
בעיתהמחשב על הירח בעיה:X=Y ? Apollo Computer 1G bit disk 1K bit/sec channel Y X Base station computer original 1G bit disk
כמעט משפט: לכל מספר פריקN קייםX<N וזר ל-N כך ש: X^(N-1) <> 1 (mod N) מסקנה: לפחות מחצית מן הטבעייםX הקטנים מ-N מקיימים X^(N-1) <> 1 (mod N) משפט: לכל ראשוניP וטבעיX<P, מתקיים: X^(P-1) = 1 (mod P) דוגמה:P=7 : 2^6 = 64 = 1 (mod 7) : P=6 2^5 = 32 = 2 (mod 6) משפט פרמה (הקטן)
repeat 1000 times x = random(1….N-1) y = x^(N-1) mod N if y=1 return “not prime” return “prime” קלט: מספר טבעיN פלט: האםN ראשוני? משפט: (1) אםN ראשוני אזי האלגוריתם יחזיר “ראשוני” (2) אםN פריק אזי הסתברות שהאלגוריתם יחזיר “ראשוני” הינה < 1000-^2. בדיקת ראשוניות
repeat p = random(1…N-1) if Prime(p) return(p) קלט:N פלט: מספר ראשוני מקרי הקטן מ-N למה: תוחלת מספר הלולאות עד למציאת ראשוניהינה: O(n) בחירת מספר ראשוני מקרי
משפט: אםP ראשוני אזי x^2=1 (mod P) ==> x=1 or x=P-1 כמעט משפט 2:אםN פריק אזי קייםx אחר כך ש: x^2 =1 (mod P) דוגמה: 307^2 =1 (mod 561) עובדה עצובה: 561 אינו ראשוני אבל לכלX<561 X^560 =1 (mod 561) משפט נכון: לכלN פריק מתקיים או “כמעט משפט 1” או “כמעט משפט 2”. תיקון ה”כמעט משפט”
הצפנתRSA בחרN=PQ (כאשרP, Q ראשוניים). ספר לעולם אתN אך שמור אתP, Q בסוד. קבעe=17. X יוצפןע”י: (X^e) mod N פענוח קשה למי שאינו יודע אתP, Q פרוק לגורמים קלט:N פלט: פרוק שלN לגורמים ראשוניים הוצאת שורשמודולוN קלט:N, Y, e פלט:X כך ש: X^e = Y (mod N) (עבור ... e= 2, 3,17 ) בעיות חישוב קשות
מסקנה: אם d = 1/ e (mod ) אזי (X^ e)^d = X (mod N) למה: אםN=PQ ו- =(P-1)(Q-1) אזי X^ = 1 (mod N) הוצאת שרש בהינתןP,Q