פוסט לכבוד יום הקירוב של
ביום פאי האחרון קראתי איך מחשבים ייצוג עשרוני וייצוג שבר משולב של קבועים מתמטיים. אם מדובר במספרים רציונליים אז חילוק ארוך מאפשר למצוא את הספרות שלהם. אבל אם הם לא רציונליים צריך למצוא נוסחא שתאפשר לחשב אותם באופן אפקטיבי. זה בדרך כלל אומר סכום אינסופי או שבר משולב אינסופי שהמרכיבים שלהם רציונליים. פה אני אתן דוגמא לאיך זה עובד עם
כדי למצוא נוסחא לטאו צריך להתחיל בתכונה יחסית קרובה להגדרה שלו. נזכיר ש-
את הפונקציה
את זה אפשר לפתוח בעזרת נוסחת הבינום
ולקבל
זו היתה הנגזרת
האיברים בסדרה זו הם בערך ביחס של
אפשרות אחרת היא שהתוכנה תוציא ספרה אחת בכל פעם (או מקדם אחד של השבר המשולב בכל פעם), ותגדיל אוטומטית את הייצוג הפנימי בהתאם לכמה איברים היא סכמה. בשביל זה צריך לכתוב קצת אחרת את הטור:
או
המובן שבו יש שיוויון, כלומר שבו הביטוי הזה מייצג מספר ממשי, הוא שההרכבה של כל ההעתקות האלה מתכנסת: ההעתקות מעבירות את הקטע
איך עוברים מהייצוג הזה לייצוג עשרוני? שומרים מצב פנימי שהוא העתקה מהצורה
a, b, c = 6, 0, 1 # x -> 6x = (6x + 0) / 1
n = 1
while True:
if (digit := (a+b)//c) == (a*2+b)//c:
print(digit, end='')
# 10(x - digit) ∘ (ax + b) / c
a, b, c = a * 10, (b - digit*c) * 10, c
else:
r, s = (2*n-1)**2, 4*(2*n)*(2*n+1)
n += 1
# (ax + b) / c ∘ 1 + x * r/s
a, b, c = a*r, (a+b)*s, c*s
כדי למצוא ייצוג כשבר משולב צריך להפוך את הביטוי. בשביל זה נעבוד עם משפחת פונקציות יותר רחבה, העתקות מביוס מהצורה
a, b, c, d = 6, 0, 0, 1 # x -> 6x = (6x + 0) / (0x + 1)
n = 1
while True:
if (term := (a+b)//(c+d)) == (a*2+b)//(c*2+d):
print(term, end=', ') # or end=' + 1 / ('
# 1/(x - term) ∘ (ax + b) / (cx + d)
a, b, c, d = c, d, a - term*c, b - term*d
else:
r, s = (2*n-1)**2, 4*(2*n)*(2*n+1)
n += 1
# (ax + b) / (cx + d) ∘ 1 + x * r/s
a, b, c, d = a*r, (a+b)*s, c*r, (c+d)*s
לשם ההמחשה נראה את תחילת החישוב
- בהתחלה ההעתקה היא
. זה נותן טווח 6-12 שלא מאפשר להוציא איבר בשבר המשולב - מרכיבים עם
ומקבלים , שנותן את האיבר הראשון 6 - נחסר 6 ונהפוך, ונקבל
. זה נותן טווח 2-4 שלא מאפשר להוציא איבר - מרכיבים עם
ומקבלים , שנותן את האיבר השני 3 - ולכן
הוא אחד הקירובים הטובים ביותר של .