בעיית הלוגריתם הבדיד

באלגברה חישובית ובקריפטוגרפיה, בעיית הלוגריתם הבָּדִיד (דיסקרטי) המסומנת בקיצור DLP (באנגלית: Discrete Logarithm Problem), היא מציאת המעריך <math>x</math> בהינתן הבסיס <math>g</math> והתוצאה <math>h</math> כך שמתקיים <math>h=g^x</math>, בקיצור <math>x=\log_{g}h</math> כאשר <math>h,g</math> ו-<math>x</math> הם מספרים שלמים. 

בניגוד ללוגריתם רגיל מעל המספרים הממשיים שאותו קל לחשב בשיטות המסתמכות על קירוב, קשה לחשב לוגריתם בדיד בקבוצה סופית של מספרים שלמים מודולו שלם כלשהו הנקרא מודולוס. בעיית הלוגריתם הבדיד בחבורה ציקלית משוערת מזה כמה עשורים כבעיה מתמטית קשה והיא הבסיס למספר אלגוריתמים חשובים בהצפנת מפתח ציבורי כמו פרוטוקול דיפי-הלמן ואלגוריתם חתימה דיגיטלית DSA.

==חבורה ציקלית==

תהי <math>\mathbb{G}</math> חבורה סופית מסדר <math>m</math>. עבור כל איבר <math>g\in\mathbb{G}</math> קבוצת החזקות של <math>g</math>:
:<math>\langle g\rangle=\{g^0,g^1,g^2,...\}</math>
היא תת-חבורה ציקלית של <math>\mathbb{G}</math> שהסדר שלה הוא השלם הקטן ביותר <math>i</math> המקיים <math>g^i=1</math>. קל לראות שהרצף חוזר על עצמו כי <math>g^i=g^0</math> וכן <math>g^{i+1}=g^1</math> וכן הלאה. במקרה זה <math>g</math> נקרא יוצר או איבר פרימיטיבי (שורש פרימיטיבי). אם <math>m</math> ראשוני אז <math>\mathbb{G}</math> היא צקלית וכל איבריה פרט ל-1 הם יוצרים שלה. לעומת זאת סדר החבורה הכפלית <math>\mathbb{Z}_n^*</math> אינו ראשוני (למעט אם <math>n=1,2,3,4,6</math>). לדוגמה <math>\mathbb{Z}_{15}^*</math> לפי אוילר היא מסדר <math>(5-1)(3-1)=8</math>. לא כל האיברים של חבורה זו הם יוצרים שלה, רואים ש-2 למשל אינו יוצר של החבורה כי <math>\langle 2\rangle=\{1,2,4,8\}</math> והסדר שלו הוא 4 (כלומר אם מעלים את 2 בחזקת <math>i</math> עבור <math>i=1,2,3,...</math> רואים שמתקבלת חבורה ציקלית עם ארבעה איברים שחוזרים על עצמם). כן רואים שלפי חוקי החבורות סדר תת-חבורה תמיד מחלק של סדר החבורה. אם <math>\mathbb{G}</math> היא חבורה ציקלית מסדר ראשוני <math>q</math>, קיים יוצר של החבורה <math>g\in \mathbb{G}</math> כך שמתקיים <math>\{g^0,g^1.g^2,...,g^{q-1}\}=G</math> (למעשה יכולים להיות יוצרים רבים). במילים אחרות, עבור כל שלם <math>h\in\mathbb{G}</math> קיים שלם ייחודי <math>x\in\mathbb{G}</math> המקיים <math>g^x=h</math>. אם החבורה <math>\mathbb{G}</math> מובנת מההקשר קוראים ל-<math>x</math> "הלוגריתם הבדיד" של <math>h</math> בבסיס <math>g</math> ואפשר לכתוב זאת בקיצור <math>\log_gh</math>. כמו כן אם <math>g^{x'}=h</math> עבור שלם כלשהו <math>x'</math> אז <math>\log_gh=x'\text{ (mod }q)</math>. הסיבה שהלוגריתם נקרא כאן "בדיד" נובעת מהעובדה שהוא נלקח מעל חבורה סופית, זאת בניגוד ללוגריתם רגיל שטווח הערכים שלו הוא מעל קבוצה אין סופית.

===חוקי הלוגריתמים===
לוגריתם בדיד מציית לחוקי הלוגריתמים הרגילים. למשל, <math>\log_g1=0</math> (כאשר '1' הוא איבר יחידה של <math>\mathbb{G}</math>) וכן:
*<math>\log_g(h_1\cdot h_2)=(\log_gh_1+\log_gh_2)\text{ mod }p</math>. 
*<math>\log_{g}(h^{y}) = (y\log_{g}h) \mbox{ mod } p</math> עבור שלם <math>y</math> כלשהו.

===הגדרה פורמלית===
הגדרה פורמלית של בעיית הלוגריתם הבדיד היא:
:{| width="500"
|-
|
:נתונה חבורה ציקלית סופית מסדר <math>q</math> המסומנת ב-<math>\mathbb{G}</math> ונתון יוצר <math>g</math> של החבורה ויהי <math>h\in \mathbb{G}</math> איבר כלשהו. מצא את הלוגריתם הבדיד של <math>h</math> בבסיס <math>g</math> בקיצור <math>\log_{g} h</math> שהוא איבר יחידי <math>x</math> בטווח <math>0\le x\le q-1</math> המקיים: <math>h=g^x</math>.
|}
  
ביתר פירוט, נתון אלגוריתם פולינומי יעיל <math>\mathcal{G}</math> שמקבל את <math>1^n</math> ומחזיר את החבורה <math>\mathbb{G}</math>, הסדר שלה <math>q</math> ויוצר <math>g\in\mathbb{G}</math>. ונתון הניסוי הבא:

ניסוי לוגריתם בדיד <math>\boldsymbol{\mathbf{DLog}_{\mathcal{A},\mathcal{G}}(n)}</math>:
# מריצים את <math>\mathcal{G}(1^n)</math> כדי לקבל את <math>(\mathbb{G},q,g)</math> כאשר <math>\mathbb{G}</math> היא חבורה ציקלית מסדר <math>q</math> ו-<math>g</math> הוא יוצר של <math>\mathbb{G}</math>.
# בוחרים איבר <math>h\leftarrow\mathbb{G}</math> (אפשר לעשות זאת על ידי בחירת איבר אקראי <math>x'</math> וחישוב <math>h=g^{x'}</math>).
# האלגוריתם <math>\mathcal{A}</math> מקבל את <math>(\mathbb{G},q,g,h)</math> ומחשב את <math>x\in\mathbb{Z}_q</math>.
# הניסוי יוכתר בהצלחה אם <math>g^x=h</math> אחרת הוא מסתיים בכישלון.

בהגדרה פורמלית, אומרים שבעיית הלוגריתם הבדיד (המסומנת בקיצור DLP) קשה לפתרון ביחס ל-<math>\mathcal{G}</math> אם עבור כל אלגוריתם פולינומי הסתברותי <math>\mathcal{A}</math> קיימת פונקציית זניחות <math>\text{negl}</math> כך שמתקיים:
:<math>\Pr[\text{DLog}_{\mathcal{A},\mathcal{G}}(n)=1]\le\text{ negl}(n)</math>
במילים, ההשערה היא שקיימת חבורה <math>\mathbb{G}</math> שבה בעיית DLP קשה לפתרון מבחינה חישובית למעט בהסתברות זניחה.

===דוגמה במספרים קטנים===
אם <math>p = 97</math> אז <math>\ \mathbb{Z}^*_{97}</math> היא חבורה ציקלית מסדר <math>\ n = 96</math>. אם ניקח יוצר של <math>\ \mathbb{Z}^*_{97}</math> למשל <math>\ \alpha=5</math>. בהינתן השלם <math>\ 35</math>, הבעיה היא למצוא <math>\ x</math> המקיים <math>5^x \equiv 35 (\mbox{ mod } 97)</math>, היות ש- <math>\ 5^{32} \equiv 35 (\mbox{mod } 97)</math>, אז <math>\ \mbox{log}_{5}35 = 32</math> ב-<math>\ \mathbb{Z}^*_{97}</math>.

== הכללה של בעיית הלוגריתם הבדיד ==
נתונה חבורה ציקלית מסדר ראשוני <math>q</math>, המסומנת ב-<math>\mathbb{G}</math>, ונתונים <math>n</math> יוצרים <math>g_1,\dots,g_n\in\mathbb{G}</math>. בהינתן <math>h\in\mathbb{G}</math> איבר כלשהו, בעיית ייצוג הלוגריתם הבדיד (discrete logarithm representation problem) בקיצור DLREP, היא למצוא n-יה <math>(x_1,\dots,x_n)</math> כך ש-<math>h=g_1^{x_1}\cdots g_n^{x_n}</math>. n-יה כזו נקראת הייצוג של <math>\textstyle h=\Pi_{i=1}^n g_i^{x_i}</math> ביחס ל-<math>(g_1,...,g_n)</math>.

לדוגמה, ה-n-יה <math>(0,...,0)</math> היא הייצוג של 1 ביחס לכל בסיס <math>(g_1,...,g_n)</math>, והיא נקראת ייצוג טריוויאלי. בעיית ייצוג הלוגריתם הבדיד נחשבת לבעיה קשה, ובפרט היא קשה יותר מבעיית הלוגריתם הבדיד (אם ניתן לפתור את בעיית ייצוג הלוגריתם הבדיד, אזי ניתן לפתור את בעיית הלוגריתם הבדיד). בעיית DLREP אטרקטיבית כי אפשר להשתמש בה לצורך חתימה עיוורת.

==בעיית דיפי-הלמן==
ויטפילד דיפי ומרטין הלמן פרסמו ב-1976 מאמר פורץ דרך שהעלה לראשונה את רעיון ההצפנה האסימטרית והציעו לבססה על בעיה מתמטית קשה בתורת המספרים הקשורה לבעיית הלוגריתם הבדיד שנקראת כיום בעיית דיפי-הלמן והיא מתחלקת לשתים, בעיית דיפי הלמן חישובית, המסומנת בקיצור CDH ובעיית הכרעת דיפי-הלמן המסומנת בקיצור DDH. שתיהן בעיות בעלות חשיבות רבה בתחום הקריפטוגרפיה. נתונה חבורה ציקלית <math>\mathbb{G}</math> ויוצר <math>g\in\mathbb{G}</math> ונתונים שני איברים מהחבורה <math>h_1</math> ו-<math>h_2</math> כאשר <math>h_1=g^x</math> ו-<math>h_2=g^y</math> עבור שני שלמים <math>x</math> ו-<math>y</math> לא ידועים. פונקציית דיפי-הלמן מוגדרת כדלהלן:
:<math>\text{DH}_g(h_1,h_2)=g^{x\cdot y}=h_1^y=h_2^x</math>.
הבעיה הראשונה, בעיית CDH, היא לחשב את פונקציית דיפי-הלמן <math>\text{DH}_g(h_1,h_2)</math> עבור שני איברים אקראיים <math>h_1,h_2</math> (כאשר <math>x</math> ו-<math>y</math> אינם ידועים אחרת הבעיה טריוויאלית). הבעיה השנייה DDH היא בעיית הכרעה, להבחין בין פלט הפונקציה <math>\text{DH}_g(h_1,h_2)</math> לבין איבר אקראי כלשהו מהחבורה. במילים אחרות עבור איברים <math>h_1,h_2</math> שנבחרו באקראי ופתרון אפשרי <math>h'</math> הבעיה היא להכריע האם <math>h'=\text{DH}_g(h_1,h_2)</math> או <math>h'</math> הוא איבר אקראי חסר משמעות.

אם בעיית הלוגריתם הבדיד קלה לפתרון אז אפשר לפתור גם את בעיית דיפי-הלמן, תחילה מחשבים את <math>x=\log_gh_1</math> ואז מחזירים את <math>h_2^x</math>. מאידך לא ברור האם קושיה המשוער של בעיית דיפי-הלמן שקול לבעיית הלוגריתם הבדיד.

בעיית DDH נחשבת לבעיה קשה ביחס ל-<math>\mathbb{G}</math> אם עבור כל אלגוריתם הסתברותי פולינומי <math>\mathcal{A}</math> קיימת פונקציית זניחות <math>\text{negl}</math> כך שהמתקיים:
:<math>|\Pr[\mathcal{A}(\mathbb{G},q,g,g^x,g^y,g^z)=1-\Pr[\mathcal{A}(\mathbb{G},q,g,g^x,g^y,g^{xy})=1]|\le\text{ negl}(n)</math>
כאשר <math>x,y,z</math> הם איברים אקראיים. במילים פירושו שהבעיה האמורה קשה אם לא קיים אלגוריתם <math>\mathcal{A}</math> שמצליח להכריע האם <math>z=xy</math> בהסתברות משמעותית ביחס לסדר החבורה. אם <math>z</math> נבחר באקראי מתוך <math>\mathbb{Z}_q</math> באופן בלתי תלוי בערכים אחרים אז האיבר <math>g^z</math> הוא בעל התפלגות אחידה בדידה ב-<math>\mathbb{G}</math>.

ישנן מספר חבורות בהן בעיית הלוגריתם הבדיד ותאומה בעיית דיפי-הלמן קשות לפתרון. העדיפות היא לחבורה ציקלית מסדר ראשוני והסיבות הן ראשית משום שידוע שאם סדר החבורה אינו ראשוני אפשר לצמצם את בעיית הלוגריתם הבדיד לבעיה בתת-חבורות שלה שהן יותר קטנות ולכן הפתרון קל יותר. שנית, קל למצוא יוצר בחבורה מסדר ראשוני כי כל איברי החבורה הם יוצרים. בנוסף, קל יותר למצוא הופכי כפלי של מעריך כלשהו דבר שרצוי במבנים קריפטוגרפיים מסוימים ובעיקר הסיבה היא שזה הגיוני להשתמש בחבורה מסדר ראשוני כי אם הסדר ראשוני אפשר להוכיח שפלט הפונקציה <math>\text{DH}_g(h_1,h_2)</math> הוא כמעט אקראי בהשוואה להתפלגות אחידה מעל <math>\mathbb{G}</math>.

למרות זאת, החבורה הכפלית <math>\mathbb{Z}_p^*</math> עם ראשוני <math>p</math> נפוצה בישומים מעשיים למרות שסדר החבורה הזו אינו ראשוני. ההשערה היא שבעיית הלוגריתם הבדיד בחבורה זו קשה גם היא בתנאי שמשתמשים בתת-חבורה מתאימה של <math>\mathbb{Z}_p^*</math>. האיבר <math>y\in\mathbb{Z}_p^*</math> הוא שארית ריבועית מודולו <math>p</math> אם קיים איבר <math>x\in\mathbb{Z}_p^*</math> המקיים <math>x^2\equiv y\text{ (mod }p)</math>. כך שקבוצת כל השאריות הריבועיות היא תת-חבורה של <math>\mathbb{Z}_p^*</math>. מחצית מהאיברים של החבורה <math>\mathbb{Z}_p^*</math> הם שאריות ריבועיות מודולו <math>p</math>. אם <math>p</math> הוא מספר ראשוני "חזק", כלומר <math>p=2q+1</math> כאשר <math>q</math> ראשוני אז מספר האיברים בתת-החבורה המכילה את כל השאריות הריבועיות מודולו <math>p</math> הוא <math>(p-1)/2=q</math> והיות ש-<math>q</math> ראשוני תת-חבורה זו ציקלית. יתרה מזו כל האיברים בתת-חבורה זו הם יוצרים שלה. כדי למצוא יוצר, פשוט בוחרים איבר אקראי כלשהו <math>x</math> שהתנאי הוא שלא יהיה שקול ל-<math>\pm 1</math> (מודולו <math>p</math>) ואז מציבים <math>g=x^2</math> מודולו <math>p</math>.

===דוגמה לבעיית דיפי-הלמן במספרים קטנים===
נתון הראשוני <math>p=97</math> החבורה הציקלית <math>\mathbb{Z}_{97}^*</math> מסדר <math>n=96</math> והיוצר <math>g=5</math>. אם נבחר <math>x=32</math> וכן <math>y=17</math>. אם נתונים האיברים <math>5^{32}\equiv 35</math> ו-<math>5^{17}\equiv 83</math> (מודולו 97), בעיית דיפי-הלמן היא לגלות את <math>5^{17\cdot 32}\equiv 5^{64}\equiv 61\text{(mod }97)</math> (כאשר <math>x</math> ו-<math>y</math> לא ידועים), יש לשים לב שאת החזקה מצמצמים מודולו ההסדר של החבורה 96.

==עקום אליפטי==

חבורה אחרת שבה ההשערה היא שבעיית הלוגריתם הבדיד קשה היא אוסף הנקודות על עקום אליפטי. היתרון שלו הוא שבניגוד לחבורה כפלית לא ידוע על אלגוריתם שמסוגל לפתור את בעיית הלוגריתם הבדיד בזמן ריצה תת-מעריכי בחבורת העקום האליפטי. בקצרה, יהי <math>p\ge 5</math> מספר ראשוני ונתונה משוואה ממעלה שלישית <math>E</math> בשני נעלמים <math>x</math> ו-<math>y</math> מהצורה:
:<math>y^2=x^3+Ax+B\text{ mod }p</math>.
כאשר <math>A,B\in\mathbb{Z}_p</math> הם קבועים המקיימים את התנאי <math>4A^3+27B^2\not\equiv 0\text{ (mod }p)</math> (תנאי זה הכרחי כדי להבטיח שלא יהיו בעקום קצוות חדים) נניח ש-<math>\hat E(\mathbb{Z}_p)</math> מייצג את כל הזוגות <math>(x,y)\in\mathbb{Z}_p\times\mathbb{Z}_p</math> המקיימים את המשוואה האמורה, אז העקום האליפטי הוא <math>E(\mathbb{Z}_p)=\hat E(\mathbb{Z}_p)\cup\{\mathcal{O}\}</math>. במילים, אוסף כל הנקודות המקיימות את המשוואה האמורה עם נקודה מיוחדת הנקראת "הנקודה באין סוף" המסומנת ב-<math>\mathcal{O}</math>. קיים כלל חיבור מסובך שמאפשר לחבר שתי נקודות בעקום כדי לקבל נקודה שלישית שגם היא בעקום; <math>R=P+Q</math> או חיבור נקודה בעצמה <math>Q=P+P=2P</math>. למרבה ההפתעה אפשר להוכיח שקבוצת הנקודות בעקום <math>E</math> יחד עם כלל החיבור יוצרים חבורה אבלית. שהיא חבורה סגורה תחת כלל החיבור כשהנקודה באין סוף משמשת כאיבר יחידה. לכל נקודה יש נקודה הופכית וכן חוקי האסוציאטיביות והקומוטטיביות מתקיימים בה.

בעיית הלוגריתם הבדיד בעקום אליפטי היא כדלקמן. נתון עקום אליפטי <math>E(\mathbb{Z}_p)</math> ונתונה נקודה כלשהי <math>P\in E(\mathbb{Z}_p)</math> הנקראת נקודת הבסיס וכן הנקודה <math>Q\in\langle P\rangle</math> מצא שלם <math>l</math> המקיים <math>Q=lP</math>. השלם <math>l</math> נקרא הלוגריתם הבדיד של הנקודה <math>Q</math> בבסיס הנקודה <math>P</math> או בקיצור <math>l=\log_PQ</math>. הקבוצה <math>\langle P\rangle</math> היא תת-חבורה ציקלית המכילה את אוסף כל הנקודות שהן כפולות של <math>P</math> כלומר <math>\{P,2P,3P,4P,...\}</math> עד שמגיעים לנקודה באין סוף (נניח שנמצא שלם <math>t</math> כך שמתקיים <math>tP=\mathcal{O}</math>) הנקודה <math>Q</math> נמצאת אי שם בחבורה זו כאשר השלם <math>l<t</math> מייצג את מספר הפעמים שהיה צריך לחבר את הנקודה <math>P</math> כדי להגיע ל-<math>Q</math>:
:<math>Q=\underbrace{ P+P+\cdots+P }_{l\text{ times}}</math>
האלגוריתם הטוב ביותר הידוע כיום לפתרון בעיית הלוגריתם הבדיד בעקום אליפטי (אם לא מביאים בחשבון אלגוריתם קוונטי) היא גרסה מקבילית של אלגוריתם רו של פולרד ללוגריתמים.

==אלגוריתמים==
באופן כללי נתונה חבורה הציקלית <math>\mathbb{G}</math> עם היוצר <math>g</math> והאיבר <math>y\in\langle g\rangle</math> הבעיה היא מציאת השלם <math>x</math> המקיים <math>g^x=y</math> (בתת-החבורה הנוצרת על ידי <math>g</math> או בחבורה <math>\mathbb{G}</math> אם <math>g</math> הוא יוצר שלה), המסומנת בקיצור <math>\log_gy</math> מודולו הסדר של <math>g</math> שנקרא לעיתים הבסיס. אותה אפשר לפתור בכמה דרכים. הפתרון הנאיבי ביותר הוא שיטת כוח גס, כלומר אפשר לחשב את כל החזקות של <math>g</math> לפי סדר <math>g^1,g^2,g^3,...</math> עד שמתקבל <math>y</math>. סיבוכיות הפתרון היא מסדר גודל <math>O(q)</math>. קיימים מספר אלגוריתמים שלהם סיבוכיות טובה יותר והם מתחלקים לשתי קטגוריות. אלגוריתם גנרי שפועל על כל חבורה ואלגוריתם שפועל רק על חבורה ספציפית. לצורך הדיון אפשר להתעלם מהחבורה <math>\mathbb{G}</math> ולהתייחס ישירות לתת-החבורה <math>\langle g\rangle</math> שהיא מסדר <math>q</math> שההנחה היא שהוא מספר ראשוני ידוע. להלן רשימת האלגוריתמים הידועים לפתרון בעיית הלוגריתם הבדיד וכן בעיית דיפי-הלמן.
*אלגוריתם צעד-קטן צעד-גדול של דויד שנקס שמסוגל למצוא לוגריתם בדיד בזמן ריצה של <math>O(\sqrt{q}\times \text{polylog}(q))</math> ובסיבוכיות מקום בסדר גודל <math>O(\sqrt{q})</math>.
*אלגוריתם פוליג-הלמן הוא אלגוריתם ספציפי המתאים במקרה שהגורמים הראשוניים של סדר החבורה <math>q</math> ידועים. במיוחד, אם לסדר החבורה יש גורמים קטנים, אלגוריתם זה מאפשר לצמצם את הבעיה לשתי בעיות לוגריתם בדיד מסדר קטן יותר (לפי גודלם של הגורמים הראשוניים) והפתרונות שלהם ניתנים לשילוב כדי לקבל פתרון לבעיה המקורית בסיבוכיות זמן זהה לבעיות הקטנות.
*אלגוריתם רו של פולרד ללוגריתמים שזמן ריצתו הוא <math>O(\sqrt{q})</math> בדומה לאלגוריתם צעד-קטן צעד-גדול אך ללא סיבוכיות מקום.
*אלגוריתם תחשיב אינדקסים שרץ בזמן ריצה תת-מעריכי ונחשב לאלגוריתם החזק ביותר הידוע כיום לפתרון בעיית הלוגריתם הבדיד בחבורות מסדר גדול מאוד כמו <math>\mathbb{Z}^*_n</math> עבור <math>n\ge 500</math> פריק. גרסה אחת שלו הנקראת אלגוריתם Coppersmith מסוגלת להגיע לזמן ריצה של <math>\textstyle L_ {2^m}\left[ \frac{1}{3}, c \right]</math> עבור קבוע כלשהו <math>c < 1.587</math>.
* כאשר מחשבים קוונטיים יהיו מעשיים אפשר יהיה לפתור את בעיית הלוגריתם הבדיד בזמן פולינומי עם אלגוריתם שור.

===אלגוריתם צעד-קטן צעד-גדול===
המחשה של אלגוריתם צעד-קטן צעד-גדול
אלגוריתם צעד-קטן/צעד-גדול של דויד שנקס הוא אלגוריתם כוח גס רקורסיבי שעושה שימוש בזיכרון כדי לפתור את בעיית הלוגריתם הבדיד בחבורה ציקלית מסדר <math>q</math> בזמן ריצה של <math>O(\sqrt{q}\cdot\text{polylog}(q))</math>. הרעיון הוא פשוט. בהינתן תת-חבורה ציקלית <math>\langle g\rangle</math> ואיבר <math>y\in\langle g\rangle</math>, אפשר לדמיין את החבורה כמעגל של האיברים <math>1 = g^0,g^1,g^2,...,g^{q-2},g^{q-1},g^{q}=1</math>.

ידוע ש-<math>y=g^x</math> חייב להיות היכן שהוא בתוך המעגל, במקום לחשב ולאחסן בזיכרון את כל האיברים של המעגל עד שנמצא <math>x</math> שזה אינו מעשי, "מסמנים" נקודות במעגל במרווחים קבועים (או מדלגים במרחק קבוע) לפי <math>t=\lfloor\sqrt{q}\rfloor</math>. במילים אחרות מחשבים ומאחסנים בטבלה ממוינת בזיכרון את האיברים:
:<math>g^0,g^t,g^{2t},...,g^{\lfloor q/t\rfloor\cdot t}</math>.
שלב זה נקרא "צעד-גדול". כעת היות ש-<math>y=g^x </math> נמצא באחד מהמרווחים, מובטח שאחד מ-<math>t</math> האיברים 
:<math>y\cdot g^0=g^x,y\cdot g^1=g^{x+1},...,y\cdot g^t=g^{x+t}</math>
יהיה שווה לאחת מהנקודות שאוחסנו בטבלה בזיכרון, שלב זה נקרא "צעד-קטן". נניח ש-<math>y\cdot g^i=g^{k\cdot t}</math> עבור <math>i</math> ו-<math>k</math> כלשהם, אפשר בקלות לפתור את הלוגריתם על ידי <math>y=g^{kt-i}</math> או <math>\log_gy=(kt-i)\text{ mod }q</math>.

האלגוריתם דורש <math>O(\sqrt{q})</math> העלאות בחזקה בחבורה <math>\mathbb{G}</math>, כל פעולה כזו מתבצעת בזמן של <math>O(\text{polylog}(q)) </math> פעולות בסיסיות, אם משתמשים באלגוריתם יעיל לחישוב חזקות בחבורה. אך יש צורך לאחסן בזיכרון <math>\sqrt{q}</math> איברים בערך. למעשה ברקורסיה, למעט האיבר הראשון לחישוב כל איבר נדרשת פעולת כפל אחת: <math>g_i=g_{i-1}\cdot g_1</math> באופן דומה כל <math>y_i</math> ניתן לחישוב כ-<math>y_i=y_{i-1}\cdot g</math>. מיון ניתן לביצוע בזמן של <math>O(\sqrt{q}\log q)</math> וחיפוש בינארי מתבצע בזמן של <math>O(\log q)</math>.

====פירוט מהלכי האלגוריתם====
קלט: תת-חבורה <math>g\in\mathbb{G}</math>, האיבר <math>y\in\langle g\rangle</math> וסדר החבורה <math>q</math>.

פלט: <math>\log_gy</math>.

# מחשבים את <math>t=\lfloor \sqrt{q}\rfloor</math>.
# עבור <math>i=0</math> עד <math>\lfloor q/t\rfloor</math> מבצעים כדלהלן:
## מחשבים את <math>g_i=g^{i\cdot t}</math>.
# ממיינים את כל הזוגות (<math>i,g_i</math>) לפי הערך השני.
# עבור <math>i=0</math> עד <math>t</math> מבצעים:
## מחשבים את <math>y_i=y\cdot g^i</math> ובודקים
## אם <math>y_i=g_k</math> עבור <math>k</math> כלשהו מחזירים את <math>(kt-i)</math> מודולו <math>q</math>.

====דוגמה במספרים קטנים====
בחבורה <math>\mathbb{Z}_{29}^*</math> מסדר <math>q=28</math>, אם <math>g=2</math> ו-<math>y=17</math> כדי לחשב את הלוגריתם הבדיד של 17 בבסיס 2 תחילה מחשבים את <math>t=5</math> ואז מכינים טבלה עם זוגות הערכים הבאים (מודולו 29) ממוינת לפי הערך השני:
<center>
{| class="wikitable" dir="ltr"
|-
! 1 !! 2 !! 3 !! 4 !! 5 !! 6
|-
| <math>0,2^0=1</math> || <math>5,2^5=3</math> || <math>10,2^{10}=9</math> || <math>25,2^{25}=11</math> || <math>20,2^{20}=23</math> || <math>15,2^{15}=27</math>
|}
</center>
ואז מחשבים את הערכים הבאים עם המונה <math>i=0,1,2,...</math>:
:<math>17\cdot 2^0=17,17\cdot 2^1=5,17\cdot 2^2=10,17\cdot 2^3=20,17\cdot 2^4=11</math>
בחיפוש מהיר מסתבר שהערך האחרון שהתקבל זהה למעשה לכניסה הרביעית בטבלה לכן <math>\log_217=25-4=21</math> מודולו 29.

==לוגריתם בדיד בקריפטוגרפיה==
בלוגריתם בדיד, בדומה לפירוק לגורמים, ישנן שתי פעולות הופכיות שאינן סימטריות בכוח החישוב הדרוש לביצוען. לדוגמה, כפל ופירוק לגורמים הם פעולות הפוכות, בעוד שכפל היא פעולה קלה במונחי מחשוב, הרי שפירוק לגורמים קשה הרבה יותר ממנה. כן הדבר בלוגריתמים, העלאה בחזקה מודולרית (מודולו שלם <math>n</math>) קלה הרבה יותר ממציאת החזקה מודולו <math>n</math>. חוסר הסימטריה הזה נקרא פונקציה חד-כיוונית, והיא מנוצלת היטב בעיקר בהצפנה אסימטרית. דוגמאות הן: פרוטוקול דיפי-הלמן להעברת מפתח, צופן אל-גמאל, חתימה דיגיטלית של אל-גמאל ואלגוריתם חתימה דיגיטלית DSA.

כדי להתמודד עם האיום של האלגוריתמים המנויים לעיל, ההנחה היא כיום שראשוני <math>p</math> בגודל 2048 סיביות מספק מרווח ביטחון סביר. תקן DSA מגדיר למשל מספר רמות אבטחה לאלגוריתם חתימה דיגיטלית כשהמרבית היא, p ראשוני בסדר גודל של 3072 סיביות.

החבורות שיש בהן עניין מבחינה קריפטוגרפית הן; החבורה הכפלית <math>\ \mathbb{Z}^*_p</math> מעל שדה ראשוני גדול, החבורה הכפלית <math>\ \mathbb{F}^*_q</math> מעל שדה סופי מורחב <math>\ \mathbb{F}_q</math> כאשר <math>\ q=p^k</math> ו-<math>\ k\ge1</math> וכן החבורה הכפלית <math>\ \mathbb{F}^*_{2^m}</math> מעל שדה בינארי <math>\ \mathbb{F}_{2^m}</math> עם מציין 2. כן יש עניין מיוחד בחבורה <math>\ \mathbb{Z}^*_n</math> כאשר <math>\ n</math> שלם פריק, קבוצת הנקודות בעקום אליפטי המוגדר מעל שדה סופי ועקום היפר-אליפטי מעל שדה סופי.

==ראו גם==
* בעיית RSA
* אלגוריתם רו של פולרד ללוגריתם הבדיד

==קישורים חיצוניים==
* 

==הערות שוליים==

קטגוריה:תורת החבורות
קטגוריה:לוגריתמים
קטגוריה:פעולות בינאריות
קטגוריה:קריפטוגרפיה
קטגוריה:חשבון מודולרי