המאמרים באתר מוגנים בזכויות יוצרים. ניתן לעשות שימוש למטרות פרטיות ולא מסחריות תוך קישור לעמוד המקורי ומתן קרדיט לגדי איידלהייט. לפרטים נא לפנות לאימייל gadieide@yahoo.com.

מעונינים לקבל מידע אסטרונומי ישירות לנייד? הצטרפו לערוץ הטלגרם או לערוץ הווטצאפ של אסטרונומיה ומדע !

יום ראשון, 9 במרץ 2025

יום הפאי - π

השבוע (או היום) חוגגים ברחבי העולם את יום הפאי. בכתיב אמריקאי התאריך היום הוא 3.14 וזהו קירוב למספר פאי. מי שרוצה לדייק עוד יותר, ירים כוסית בדיוק בשעה 1:59.26 ויתקרב קירוב מצוין למספר 3.1415926
 
המספר האמיתי אורכו אינסופי ולא ניתן להצגה כשבר כלשהו אבל ניתן לבניה ככל מיני סדרות שונות ומשונות. תורת ההסתברות מוכיחה כי בכל מספר אי-רציונלי נורמלי, כל רצף סופי של ספרות חייב להופיע. לא ידוע אם π (פאי) הוא מספר נורמלי. מספר נורמלי הוא מספר ממשי אי-רציונלי שבו, בבסיס מסוים (כמו בסיס 10), כל ספרה מופיעה בתדירות שווה בטווח הארוך, וכל רצף אפשרי של ספרות מופיע בהסתברות הצפויה. למרות שהמספר π נחקר רבות וחושב עד טריליוני ספרות, אין הוכחה לכך שהוא נורמלי באף בסיס. עם זאת, ניתוחים סטטיסטיים של הספרות הידועות שלו מצביעים על כך שהן מתנהגות כאילו π הוא מספר נורמלי, אך זו אינה הוכחה. רבים מהמתמטיקאים משערים ש-π הוא מספר נורמלי, אך הוכחה לכך נותרה בעיה פתוחה בתורת המספרים.

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

הפיזיקאי ריצרד פיינמן הביע פעם משאלה לזכור בעל פה את 767 הספרות הראשונות של פאי אחרי הנקודה. הסיבה היא ש-שש הספרות האחרונות ברצף הן תשע וזה די מרשים לסיים כך את ההקראה: " אחד אחד שלוש ארבע תשע תשע תשע תשע תשע תשע!" ולרדת מהבמה לקול תשואות הקהל. בכל מקרה גם רצף של 1000 תשיעיות יהיה קיים איפשהו במספר.

המספר פאי מתאר את היחס בין קוטר המעגל להיקפו, אולם נתקלים בו במקומות רבים מאד בכל תחומי  המתמטיקה, בתורת המספרים ובהסתברות ובמקומות רבים נוספים. גם במקורות היהודים ניתן למצוא את פאי, במקומות צפויים כמו בבניית המקדש, ובהלכות סוכה (כמה גדולה צריכה להיות סוכה עגולה?), ובציורים של התוספות שם (וראו בפירוט: בועז צבאן ודוד גרבר, ערכים מדויקים של פאי במקורות היהדות). עוד סיבה לחגיגה היא שהיום נולד המדען אלברט איינשטיין. ולפעמים החגיגה היא כפולה. בשנים מסוימת חל היום בי"ד באדר, מה שמוכיח שלא כל יום (הפאי) פורים. אבל ביננו, הדבר הכי טוב בפאי זה שהוא גם טעים! יום פאי שמח!



הרחבות, סקריפטים, נוסחאות מסובכות ובינה מלאכותית


רוצים לגלות עוד ועוד ספרות של פאי? ניתן להשתמש בנוסחת ביילי-בורווין-פלופי לחישוב הספרות של פאי. הנוסחה מאפשרת לחשב ספרות של פאי (אם כי בייצוג הקסדצימלי ולא בינארי או דצימלי) מבלי לחשב את הספרות הקודמות וכך התהליך מאד יעיל. אני לא ממש מבין אותה, נו טוב, אני ממש לא מבין אותה, אבל CHAT-GPT (ג'מיני משום מה נכשל ולא היה לי כוח לתקן לו את הקוד ) כתב את הקוד הקומפקטי הבא שמוציא כמה ספרות של פאי שאתם רוצים ואכן תוכלו להיווכח בעצמכם ברצף התשיעיות אבל אני לא יכול להיות משוכנע שהערך לחלוטין נכון.

import itertools

def pi_digits():
    q, r, t, k, n, l = 1, 0, 1, 1, 3, 3
    while True:
        if 4 * q + r - t < n * t:
            yield n
            nr = 10 * (r - n * t)
            n = (10 * (3 * q + r)) // t - 10 * n
            q *= 10
            r = nr
        else:
            nr = (2 * q + r) * l
            nn = (q * (7 * k + 2) + r * l) // (t * l)
            q *= k
            t *= l
            l += 2
            k += 1
            n = nn
            r = nr

if __name__ == "__main__":
    for digit in pi_digits():  # Runs forever until manually stopped
        print(digit, end="")

בכדי להיות בטוח בתוצאות ביקשתי ממנו AI אחר, קלוד, לכתוב קוד בשיטה שונה מעט. קלוד העדיף דווקא את אלגוריתם צ'ודנובסקי  (שגם אותו אני לא מבין כלל, אבל הוא איטי בהרבה עקב השימוש הרב בפונקציית עצרת).

import decimal
import time

# Set precision to a large value
decimal.getcontext().prec = 10000  # Increase as needed for more digits

def chudnovsky(n):
    """
    Chudnovsky algorithm for calculating pi
    Returns the sum of the Chudnovsky series to n terms
    """
    decimal.getcontext().prec = n + 10  # Extra precision for intermediate calculations
    
    sum = decimal.Decimal(0)
    k = 0
    
    while k < n:
        term = decimal.Decimal((-1)**k) * decimal.Decimal(factorial(6*k)) / \
               ((factorial(3*k) * factorial(k)**3) * decimal.Decimal(640320)**(3*k))
        sum += term
        k += 1
    
    pi = decimal.Decimal(426880) * decimal.Decimal(10005).sqrt() / sum
    return pi

def factorial(n):
    """Compute factorial of n"""
    if n == 0:
        return decimal.Decimal(1)
    result = decimal.Decimal(1)
    for i in range(1, n + 1):
        result *= i
    return result

def calculate_pi_iteratively():
    """Simplified approach using mpmath for large calculations"""
    # Since the Chudnovsky algorithm is complex for high precision,
    # we'll use a simpler approach with the decimal module
    
    decimal.getcontext().prec = 10000  # Set precision
    
    # Use the arctangent formula: π = 16*arctan(1/5) - 4*arctan(1/239)
    arctan1_5 = arctan(decimal.Decimal(1) / decimal.Decimal(5))
    arctan1_239 = arctan(decimal.Decimal(1) / decimal.Decimal(239))
    
    pi = decimal.Decimal(16) * arctan1_5 - decimal.Decimal(4) * arctan1_239
    return pi

def arctan(x, iterations=1000):
    """Calculate arctan(x) using Taylor series"""
    result = decimal.Decimal(0)
    xpower = x
    
    for i in range(iterations):
        term = xpower / (2*i + 1)
        if i % 2 == 0:
            result += term
        else:
            result -= term
        xpower *= x*x
        
        # Break if we reach the precision limit
        if abs(term) < decimal.Decimal('1e-' + str(decimal.getcontext().prec)):
            break
    
    return result

def main():
    # Calculate pi to high precision
    pi = calculate_pi_iteratively()
    pi_str = str(pi)
    
    print("Now printing digits of π endlessly:")
    print(pi_str[:2], end="")  # Print "3."
    
    # Print remaining digits with pause between each
    digit_index = 2
    try:
        while True:
            if digit_index < len(pi_str):
                print(pi_str[digit_index], end="", flush=True)
                digit_index += 1
            else:
                # If we've printed all calculated digits, recalculate with higher precision
                decimal.getcontext().prec += 1000
                pi = calculate_pi_iteratively()
                pi_str = str(pi)
            
            time.sleep(0.1)  # Adjust speed of output
            
    except KeyboardInterrupt:
        print("\nPi calculation stopped.")

if __name__ == "__main__":
    main()

הנה ההסברים של קלוד לקוד (הממ, משחק מילים חביב) שהוא כתב, עם מעט הסברים על הנוסחה:

The Chudnovsky Algorithm for Computing π

The Chudnovsky algorithm is one of the most efficient methods for calculating π to high precision. Developed by the Chudnovsky brothers (David and Gregory) in the late 1980s, it's remarkable for its efficiency and is still used today for record-breaking π calculations.

The Formula

The algorithm is based on the following series representation of 1/π:



Where C = 426880√10005

When implemented, the formula is typically rewritten as:




Why It's So Efficient

The Chudnovsky algorithm has several key advantages:

  1. Rapid Convergence: Each term of the series gives approximately 14 additional decimal digits of π.

  2. Binary Splitting: The algorithm can be implemented using binary splitting, a technique that accelerates the computation of large factorial terms.

  3. Linear Complexity: The algorithm has approximately linear complexity when computing n digits of π, meaning doubling the digits roughly doubles the computation time.

Historical Impact

This algorithm has been used for virtually all recent π-computation records. For example:

  • In 2019, Emma Haruka Iwao used it with Google Cloud to calculate π to 31.4 trillion digits
  • In 2021, researchers used it to calculate π to 62.8 trillion digits

In the Code

In the code I provided, I included both the traditional Chudnovsky implementation and a simpler arctangent-based approach. The traditional Chudnovsky algorithm is more complex to implement correctly because:

  1. It requires efficient factorial calculations for large numbers
  2. It needs specialized techniques for managing the precision of intermediate calculations
  3. The binary splitting optimization requires careful implementation

The arctangent formula I used instead (π = 16·arctan(1/5) - 4·arctan(1/239)) is simpler to implement but converges more slowly. For truly high-precision calculations (trillions of digits), the properly optimized Chudnovsky algorithm would be the preferred choice.




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

python3 calculatepi.py 
3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198