תכנות - שיעור 23 18/December/2005    

קצת לוגיקה

דברנו על הטיפוס bool של Python המקבל ערכים של (שקר ואמת) False, True בלבד. אפשר להפעיל את פעולת השלילה not שהופכת אמת לשקר, ושקר לאמת, וכן פעולות של או (or) ושל וגם (and) על שני ערכים בוליאנים (לוגיים). הטבלאות הבאות מתארות את חוקי החישוב.

או:

lteq1.png

וגם:

lteq2.png

יעילות בבדיקת ראשוניות

כאשר מחפשים האם קיים מחלק lteq3.png למספר lteq4.png כך ש lteq5.png כדאי כמובן להתחיל לבדוק עבור

lteq6.png
ולקדם את lteq7.png השאלה - עד איזה מספר מספיק לבדוק?

הכי פשוט לבדוק עד lteq8.png אבל זה עלול להיות תהליך איטי. קל לראות שאפשר לקצר ולבדוק עד

lteq9.png
אבל גם זה עלול להיות איטי באופן מביך. קיצור נאה יבוא מהתוצאה הבאה:

משפט: אם
lteq10.png
אז
lteq11.png
הוכחה: אם בדרך השלילה,
lteq12.png
אז אפשר להכפיל את שני אי-השויונים, ומקבלים:
lteq13.png
וזוהי סתירה לכך ש- lteq14.png

חזרה לבעית התכנות, לכן מספיק לבדוק כל עוד lteq15.png אבל אנו רוצים להמנע מחישוב יקר של שורש, ולכן עדיף לבדוק אם
lteq16.png

תרגילים

  1. הריצו את התכנית, לבדיקת ראשוניות, שכתבתם לשעור הקודם (מבלי לשפרה!), ובדקו אותה עם המספר: lteq17.png רמז: זהו מספר ראשוני!
  2. כתבו גירסא יעילה יותר של התכנית תוך ניצול הדיון שלמעלה. הריצו שוב עם אותו ראשוני גדול.
  3. כתבו תכנית ובה פונקציה שמקבלת שני מספרים שלמים כפרמטרים
    isPythagoras(a,b)
    ומחזירה True אם
    lteq18.png
    הוא מספר רבועי, כלומר יש לו שורש רבועי שלם, ומחזירה False אחרת. התכנית תקרא לפונציה עבור כל זוגות המספרים שנתנים בשורת הפקודה, ותדפיס את "פסק הדין".

פתרון לתרגיל קודם

להלן פתרון לבדיקת מספרים ראשוניים . שניתן כתרגיל בשעור קודם .


חזרה לעמוד האם