CoCalc Shared Filesassignments / assignment17 / assignment17_particles model.ipynbOpen in CoCalc with one click!
Author: katya belga
Views : 50
In [ ]:

שמות:קטיה ועידו :)

המודל החלקיקי

הפיסיקאי ריצ'ארד פיינמן (ראו למטה) טוען כי האמירה: "כל העצמים עשויים מחלקיקים קטנים הנמצאים כל הזמן בתנועה. כאשר המרחק ביניהם קטן הם מושכים אחד את השני אבל, כאשר הם נלחצים זה לתוך זה הם דוחים האחד את השני" מכילה את האינפורמציה המדעית הרבה ביותר, במספר המצומצם ביותר של מילים. כוונתו היא שעל סמך עובדה זו בלבד ניתן להסיק חלק ניכר מהתכונות הפיסקאליות של העצמים שמסביבנו. הוכחות פיסקאליות לנכונות המודל החלקיקי של החומר מקובל לראות בשלוש תופעות:
הראשונה שבהם היא העובדה שמסה נתונה של גז קלוש מקיימת את המשוואה:
PVT=const\frac{P\cdot V}{T}=const
בנוסחה זו P הוא לחץ הגז, V נפחו ו-T הטמפרטורה של הגז. נוסחא זו מוסברת באמצעות התורה הקינטית של הגזים המבוססת על המודל החלקיקי.
התופעה השנייה היא תנועת בראון: בשנת 1827 הבחין הבוטנאי הסקוטי רוברט בראון שאבקני פרחים הצפים על פני נוזל, במקום לשקוע או להישאר במקומם מבצעים תנועה אקראית לכל הכיוונים. ההסבר לתנועת האבקנים הוא בתנועה האקראית של חלקיקי הנוזל הפוגעים באבקנים וגורמים להם לרתע בכיוונים אקראיים. ההסבר המלא לתופעה ניתן על ידי אינשטיין בשנת 1905.
התופעה השלישית היא דיפוזיה: כאשר פותחים בקבוק בושם במרכז חדר, הריח מתפשט על פני כל נפח החדר. בתמונה שלמטה מצולם גרגר של KMnO4 שהונח במרכז צלחת פטרי המלאה מים. התמונה השמאלית צולמה מיד לאחר שהגרגר הוכנס לצלחת. התמונה הימנית צולמה כעבור פרק זמן מסוים.

difusion
גם תופעת הדיפוזיה מוסברת באמצעות המודל החלקיקי. בפעילות זו ובאלו שאחריה, תבנו מודלים שונים המבוססים על התנועה האקראית של החלקיקים ותנסו להסביר בעזרתם תופעות שונות.

In [6]:
from IPython.display import HTML HTML('''<iframe src="https://he.wikipedia.org/wiki/%D7%A8%D7%99%D7%A6%27%D7%A8%D7%93_%D7%A4%D7%99%D7%99%D7%A0%D7%9E%D7%9F" width=1000 height=300"></iframe>''')

עבודה 1: חלקיקים בקופסא

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

particle_in_boxs

התוכנית

הקישור שלמטה מוביל להדמיה שניכתבה בסביבה המכונה glowscript. תוכנה זו מבוססת על חבילה ב- Python המכונה VPython והמיועדת ליצירת הדמיות תלת מימדיות. תוכנת ה- glowscript מתרגמת קוד שניכתב ב- Python ל- JavaScript ומציגה בדפדפן את ההדמיה. האתר עצמו מכיל עשרות רבת של הדמיות שניכתבו בסביבה זו וההרשמה אליו והעבודה בו היא חינמית.
שימו לב : אם הרצתם הקישור שלמטה, המחשב יפתח דף חדש המכיל את ההדמיה. למעלה תראו המחשה של הבעיה ולמטה גרף של מספר החלקיקים בצד ימין כתלות בזמן. תוכלו לסובב את חלון ההדמיה באמצעות העכבר. כדי לראות את קוד התוכנית, אתם צריכים להקליד על הקישור שמצד שמאל למעלה: View this program.

ענו על השאלות הבאות:

1. מה מתאר המשתנה N_right? איזה משתנה מתאר את מספר החלקיקים הכולל?

המשתנה N_right מתאר את מספר החלקיקים שנמצאים בצד ימין של הכופסא המשתנה N מתאר את מספר החלקיקים הכולל בתוך הכופסא

2. תארו את האופן שבו משתנה הגרף כתלות בזמן?

In [ ]:
הגרף מתאר את כמות החלקיקים בצד ימין של הכופסא. ככל שהזמן עובר מספר החלקיקים שנמצא בצד ימין של הכופסא עולה עד שמגיע בערך לחצי מהכמות הכוללת, שהיא 1000 חלקיקים, כלומר עד שנוצר מצב של שיווי משקל .

3. הריצו את ההדמיה עבור כל אחד מערכי n הבאים: 10, 20, 80, 500 ו- 1000.

In [ ]:
<div dir = "RTL"> הרצתי

4.נסחו כלל לגבי מצב שיווי משקל. האם במצב שיווי משקל משתנה מספר החלקיקים בכל צד?

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

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

‏א. נניח כי מספר החלקיקים בצד ימין של ההדמיה הוא r (המספר הכולל של החלקיקים הוא n), מה ההסתברות שהחלקיק שניבחר ימצא בצידו השמאלי של המכל (בטאו באמצעות n ומספר החלקיקים מימין).

‏ב. צרו פונקציה שתפקידה להחזיר רשימה של מספר החלקיקים בצד ימין של הקופסא כתלות בזמן. על הפונקציה לקבל כארגומנט את מספר החלקיקים הנמצאים בהתחלה בצידו השמאלי של המכל. הפונקציה צריכה להתבסס על האלגוריתם הבא: בכל פעם היא מגרילה מספר אקראי (עשרוני!) בתחום שבין 0 ל-1. במידה והמספר קטן מההסתברות של חלקיק להיות בצד שמאל, היא מעבירה חלקיק משמאל לימין (מגדילה את מספר החלקיקים בצד ימין באחד) . במידה והמספר גדול מההסתברות של חלקיק להיות בצד שמאל, היא מעבירה חלקיק מצד ימין לצד שמאל. ממשיכים בתהליך עד שייחלפו 100 מחזורים מהרגע שמספר החלקיקים מימין ישתווה למספרם משמאל.

שימו לב: בתחילת ההדמיה כל החלקיקים נמצאים בצד שמאל של המכל.
In [8]:
import random left_n = 50 def rightn(left_n): lr = [] r = 0 n = left_n #start loop till balance while r != n/2: rando = random.random() p = ((n -r)/n) if rando < p: r = r + 1 lr.append(r) else : r = r-1 lr.append(r) #start loop for hundred more times for t in range(100): rando = random.uniform(0,1) p = ((n -r)/n) if rando < p: r = r + 1 lr.append(r) else : r = r-1 lr.append(r) return (lr) rightn(left_n)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 10, 11, 12, 11, 12, 13, 12, 11, 10, 11, 12, 13, 12, 13, 14, 15, 14, 15, 16, 15, 16, 15, 16, 17, 16, 17, 16, 15, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 23, 24, 23, 22, 23, 22, 21, 22, 21, 22, 23, 22, 23, 22, 23, 22, 23, 24, 25, 24, 23, 22, 21, 22, 21, 22, 23, 24, 23, 22, 21, 22, 23, 22, 23, 24, 25, 24, 25, 26, 25, 24, 25, 26, 27, 28, 27, 28, 29, 30, 29, 28, 27, 26, 27, 28, 29, 28, 27, 26, 25, 26, 27, 26, 27, 28, 29, 30, 31, 30, 29, 30, 31, 30, 31, 30, 29, 30, 29, 30, 29, 30, 29, 30, 31, 30, 29, 30, 29, 28, 29, 30, 29, 30, 29, 28, 29, 28, 27, 28, 27, 26, 25, 26, 27, 28, 27, 28, 29, 28, 27, 28, 29, 28, 29, 30, 29, 30, 29]

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

In [8]:
import random import matplotlib.pyplot as plt def rightn(left_n): lr = [] r = 0 n = left_n #start loop till balance while r != n/2: rando = random.random() p = ((n -r)/n) if rando < p: r = r + 1 lr.append(r) else : r = r-1 lr.append(r) #start loop for hundred more times for t in range(100): rando = random.uniform(0,1) p = ((n -r)/n) if rando < p: r = r + 1 lr.append(r) else : r = r-1 lr.append(r) return (lr) def n_make(): l = [] min1 = 100 while min1 <= 2500: l.append(min1) min1 = min1 + 100 return (l) n_make() n_make_list = n_make() ls = [rightn(t) for t in n_make_list ] def grafh(ls): for i in ls: lx = [ i for i in range(len(i))] print(lx) ly = i plt.plot(lx,ly) plt.xlabel("time") plt.ylabel("particles on right side") grafh(ls)

7. נגדיר ב- T את משך הזמן הדרוש כדי שמספר החלקיקים בצד ימין ישתווה למספרם משמאל. צרו גרף המתאר את T כתלות במספר החלקיקים. מה המסקנה?
(עבור מספרי חלקיקים מ100 עד 2500)

In [26]:
import random import matplotlib.pyplot as plt def rightn(left_n): lr = [] r = 0 n = left_n #start loop till balance while r != n/2: rando = random.random() p = ((n -r)/n) if rando < p: r = r + 1 lr.append(r) else : r = r-1 lr.append(r) return(len(lr)) def n_make(): l = [] min1 = 100 while min1 <= 2500: l.append(min1) min1 = min1 + 100 return (l) n_make_list = make_n() ls = [rightn(t) for t in n_make_list ] plt.plot(n_make_list ,ls) plt.xlabel("number of particles") plt.ylabel("time taken to balance")
Text(0, 0.5, 'time taken to balance')
In [ ]:
<div dir = "RTL" > ניתן לראות כי ככל שמספר החלקיקים הכולל בכופסא גדול יותר כך הזמן הדרוש על מנת להגיע למצב של שיווי משקל שנוצר כאשר מספר החלקיקים בצד ימין ובצד שמאל משתווה-גדול יותר.

8. נסמן את מספר החלקיקים בצידו הימני של המכל במצב שיווי משקל ב-q. ככל שמספרם הכולל של החלקיקים n קטן יותר, כך גדול יותר הפיזור של q מסביב ל- n/2. העריכו את הפיזור מסביב ל- q עבור n השווה לאחד הערכים הבאים: 10, 40, 200, 400, 800

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

In [7]:
import random import matplotlib.pyplot as plt def rightn(left_n): lr = [] r = 0 n = left_n l = n sides = ["left","right"] #start loop till balance while r != n/2: rando = random.choice(sides) p = ((n -r)/n) if rando == "left": if l == 0: continue else: l = l -1 r = r + 1 lr.append(r) else : if l == 0: continue else: r = r-1 l = l + 1 lr.append(r) #start loop for hundred more times for t in range(100): rando = random.choice(sides) p = ((n -r)/n) if rando == "left": if l == 0: continue else: l = l -1 r = r + 1 lr.append(r) else : if r == 0: continue else: r = r-1 l = l + 1 lr.append(r) return (lr) rightn(800)
[1, 0, -1, 0, -1, 0, -1, -2, -3, -2, -3, -2, -3, -4, -5, -4, -3, -4, -3, -2, -3, -4, -5, -4, -3, -2, -1, 0, 1, 2, 1, 0, -1, -2, -1, 0, -1, -2, -3, -4, -3, -2, -3, -2, -1, 0, 1, 0, -1, 0, -1, -2, -1, 0, -1, -2, -3, -2, -3, -2, -3, -4, -3, -2, -1, 0, -1, -2, -3, -4, -5, -4, -5, -4, -5, -4, -3, -2, -3, -2, -1, -2, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -10, -9, -10, -9, -10, -9, -10, -9, -8, -7, -6, -5, -6, -7, -6, -5, -6, -5, -4, -5, -4, -5, -6, -5, -6, -7, -6, -5, -6, -7, -6, -5, -4, -5, -4, -5, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -12, -13, -12, -11, -10, -11, -12, -11, -12, -13, -12, -13, -12, -13, -14, -15, -16, -17, -16, -17, -18, -17, -18, -17, -18, -17, -16, -15, -14, -15, -14, -15, -14, -15, -14, -13, -12, -13, -12, -11, -12, -13, -14, -15, -14, -13, -12, -11, -12, -13, -12, -13, -14, -13, -12, -11, -12, -13, -12, -11, -12, -11, -12, -11, -12, -13, -14, -15, -16, -15, -16, -15, -16, -17, -16, -17, -16, -15, -16, -17, -16, -17, -18, -17, -18, -17, -18, -19, -18, -17, -18, -19, -18, -17, -18, -19, -18, -19, -20, -19, -20, -21, -22, -23, -22, -21, -22, -23, -24, -25, -26, -25, -24, -23, -22, -23, -22, -21, -22, -21, -20, -19, -20, -19, -18, -19, -20, -19, -18, -17, -18, -17, -18, -19, -18, -17, -16, -15, -16, -17, -16, -15, -14, -15, -16, -15, -14, -13, -14, -15, -14, -15, -14, -13, -14, -13, -14, -15, -16, -17, -18, -17, -16, -17, -16, -17, -18, -19, -18, -19, -20, -21, -22, -21, -20, -19, -18, -17, -16, -15, -16, -17, -16, -15, -16, -15, -14, -15, -16, -17, -16, -17, -16, -17, -18, -19, -18, -17, -16, -15, -14, -15, -16, -15, -14, -13, -12, -11, -10, -11, -12, -13, -12, -13, -12, -11, -12, -13, -14, -13, -12, -13, -14, -13, -14, -13, -12, -11, -12, -13, -12, -13, -12, -13, -14, -13, -14, -13, -12, -11, -12, -13, -12, -13, -14, -15, -16, -15, -16, -17, -16, -17, -16, -15, -16, -17, -16, -17, -18, -17, -18, -17, -16, -15, -14, -13, -14, -13, -12, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, -2, -1, 0, -1, -2, -3, -4, -5, -6, -5, -6, -5, -4, -3, -4, -5, -4, -3, -4, -5, -4, -5, -6, -5, -6, -7, -8, -9, -8, -9, -8, -7, -6, -7, -6, -7, -8, -7, -6, -7, -6, -7, -8, -7, -8, -9, -10, -9, -8, -7, -8, -7, -8, -7, -8, -7, -8, -7, -6, -5, -4, -5, -4, -3, -2, -3, -2, -1, 0, 1, 0, 1, 2, 3, 2, 3, 4, 3, 4, 3, 4, 3, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 9, 8, 9, 8, 7, 6, 5, 4, 5, 6, 5, 6, 5, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, -1, -2, -3, -2, -1, 0, 1, 2, 1, 2, 1, 0, -1, -2, -3, -2, -1, 0, -1, 0, 1, 2, 3, 4, 5, 6, 5, 6, 5, 4, 5, 6, 5, 6, 7, 8, 9, 10, 11, 10, 9, 8, 9, 10, 11, 12, 11, 12, 13, 12, 13, 12, 11, 12, 13, 14, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 19, 18, 17, 18, 19, 18, 17, 18, 19, 18, 17, 16, 17, 18, 19, 18, 19, 20, 21, 20, 19, 18, 19, 20, 19, 20, 19, 18, 17, 16, 15, 14, 13, 12, 13, 14, 15, 16, 15, 14, 15, 16, 15, 14, 13, 14, 15, 14, 15, 14, 15, 16, 15, 16, 15, 16, 17, 16, 15, 16, 17, 18, 17, 16, 17, 16, 17, 16, 15, 14, 15, 16, 15, 16, 17, 18, 17, 18, 19, 18, 17, 16, 17, 16, 15, 14, 15, 16, 17, 16, 17, 16, 15, 16, 15, 16, 17, 16, 17, 16, 17, 18, 19, 18, 19, 18, 17, 18, 17, 16, 15, 16, 15, 14, 13, 12, 13, 14, 13, 14, 15, 16, 17, 18, 17, 16, 15, 14, 13, 14, 15, 16, 17, 16, 17, 16, 15, 14, 15, 16, 17, 18, 17, 18, 17, 16, 17, 16, 17, 16, 17, 16, 15, 14, 15, 16, 15, 14, 13, 14, 15, 16, 17, 16, 17, 18, 17, 18, 19, 18, 19, 20, 19, 20, 19, 20, 19, 18, 17, 18, 17, 16, 15, 14, 13, 12, 11, 12, 13, 14, 13, 12, 13, 14, 15, 16, 17, 16, 15, 14, 13, 14, 15, 16, 17, 16, 15, 16, 17, 16, 17, 16, 15, 14, 15, 16, 15, 14, 13, 14, 13, 12, 13, 14, 13, 14, 15, 16, 15, 16, 17, 16, 15, 16, 15, 16, 15, 16, 17, 18, 17, 18, 19, 18, 17, 16, 15, 16, 15, 14, 13, 14, 13, 14, 15, 16, 15, 16, 17, 18, 17, 18, 19, 20, 21, 22, 23, 24, 23, 24, 23, 24, 25, 24, 25, 24, 25, 24, 25, 26, 25, 26, 25, 26, 25, 26, 25, 24, 23, 24, 25, 24, 25, 26, 27, 26, 25, 24, 23, 22, 21, 22, 21, 20, 21, 22, 21, 20, 19, 20, 21, 20, 21, 20, 19, 20, 21, 20, 21, 20, 19, 20, 21, 22, 23, 22, 21, 20, 19, 18, 19, 18, 19, 20, 21, 20, 19, 20, 19, 18, 17, 18, 17, 16, 15, 14, 13, 14, 13, 12, 13, 12, 11, 10, 9, 10, 9, 10, 9, 10, 9, 10, 11, 10, 11, 12, 11, 12, 13, 12, 11, 10, 11, 10, 9, 8, 9, 10, 11, 10, 9, 10, 11, 10, 9, 8, 7, 6, 7, 8, 7, 6, 7, 6, ...]
In [54]:
import my_statistics import random import matplotlib.pyplot as plt l_number = [10,40,200,400,800] def rightn(left_n): lr = [] r = 0 n = left_n #start loop till balance while r != n/2: rando = random.random() p = ((n -r)/n) if rando < p: r = r + 1 lr.append(r) else : r = r-1 lr.append(r) #start loop for hundred more times lstd = [] for t in range(100): rando = random.uniform(0,1) p = ((n -r)/n) if rando < p: r = r + 1 lstd.append(r) else : r = r-1 lstd.append(r) std = my_statistics.std(lstd) return (std/n) ly = [rightn(t) for t in l_number] print(ly) plt.plot(l_number, ly)
[0.1558717421471897, 0.049771980069111176, 0.0260155722597063, 0.008752285415821398, 0.004771399165863191]
[<matplotlib.lines.Line2D at 0x7f15b9f90ac8>]

9. נתון האלגוריתם הבא:

‏א. בוחרים באופן אקראי צד של המכל.

‏ב. אם ישנו חלקיק בצד שניבחר, מעבירים אותו לצד השני.

‏ג. אם אין חלקיק בצד שניבחר, לא מעבירים שום חלקיק.

האם אתם מצפים שהמערכת תתנהג באותו אופן כמקודם?

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

10. שנו את האלגוריתם לאלגוריתם שהוצג בסעיף הקודם, והריצו את התוכנית עבור n=800. האם המערכת מתנהגת בצורה דומה?

In [1]:
import random def N_right2 (n): N_left = n N_right = 0 ls = [N_right] box = ['right', 'left'] run = True while run == True: side = random.choice(box) if side == 'left' and N_left > 0: N_left = N_left - 1 N_right = N_right + 1 ls.append(N_right) elif side == 'right' and N_right > 0: N_right = N_right - 1 N_left = N_left + 1 ls.append(N_right) if (N_left == N_right): run = False print ('The length of the list is:', len(ls)) return(ls) N_right2 (800) #המערכת מתנהגת בצורה שונה #לכל צד יש סיכוי שווה לקבל או לאבד חלקיק
The length of the list is: 64077
[0, 1, 0, 1, 0, 1, 2, 3, 2, 1, 0, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6, 7, 8, 7, 8, 7, 8, 7, 8, 7, 6, 7, 6, 5, 4, 3, 4, 3, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 2, 3, 4, 3, 2, 1, 2, 1, 0, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 2, 3, 4, 5, 6, 5, 4, 3, 2, 3, 2, 3, 2, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7, 6, 5, 6, 7, 6, 7, 8, 7, 8, 7, 8, 9, 8, 7, 6, 5, 4, 3, 4, 5, 4, 5, 6, 7, 6, 5, 4, 5, 6, 5, 6, 5, 6, 7, 8, 9, 10, 9, 8, 9, 10, 11, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 4, 5, 4, 3, 2, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8, 9, 10, 9, 10, 9, 8, 9, 8, 9, 10, 9, 10, 11, 10, 9, 10, 9, 8, 7, 8, 7, 6, 5, 4, 5, 4, 3, 4, 3, 4, 3, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 0, 1, 2, 3, 4, 5, 4, 5, 6, 5, 4, 5, 6, 5, 6, 5, 4, 5, 6, 7, 6, 7, 6, 7, 8, 7, 8, 7, 8, 9, 8, 9, 8, 9, 10, 9, 8, 7, 6, 5, 6, 7, 6, 5, 6, 5, 6, 7, 8, 9, 8, 9, 10, 9, 8, 9, 8, 9, 8, 9, 8, 9, 8, 7, 6, 5, 4, 5, 4, 3, 2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 6, 5, 4, 3, 2, 1, 0, 1, 2, 1, 0, 1, 0, 1, 2, 3, 2, 3, 2, 3, 4, 3, 4, 5, 6, 7, 8, 9, 8, 7, 8, 7, 8, 7, 6, 5, 6, 7, 6, 5, 6, 5, 6, 5, 4, 5, 4, 5, 6, 7, 6, 7, 6, 5, 4, 3, 2, 3, 2, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 1, 0, 1, 2, 1, 0, 1, 0, 1, 2, 1, 2, 1, 2, 1, 0, 1, 2, 3, 2, 1, 2, 1, 2, 3, 4, 3, 4, 5, 4, 3, 2, 3, 2, 3, 2, 1, 2, 1, 0, 1, 2, 1, 0, 1, 2, 3, 2, 1, 2, 3, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 6, 7, 6, 5, 6, 5, 4, 3, 4, 3, 2, 3, 4, 3, 2, 3, 4, 3, 2, 3, 2, 3, 2, 3, 4, 3, 2, 1, 0, 1, 2, 1, 2, 1, 2, 1, 0, 1, 0, 1, 2, 3, 2, 1, 2, 3, 2, 3, 2, 1, 2, 1, 2, 1, 0, 1, 0, 1, 0, 1, 2, 3, 2, 1, 2, 1, 0, 1, 2, 1, 2, 3, 4, 3, 4, 5, 4, 3, 2, 3, 2, 3, 4, 5, 4, 5, 4, 3, 4, 5, 6, 7, 6, 5, 6, 7, 6, 7, 6, 7, 8, 9, 8, 7, 6, 7, 8, 9, 10, 11, 12, 11, 10, 11, 12, 13, 14, 13, 12, 13, 14, 13, 12, 11, 10, 9, 10, 9, 8, 7, 6, 5, 6, 7, 8, 7, 8, 9, 10, 11, 12, 11, 12, 11, 12, 11, 10, 9, 10, 11, 10, 11, 12, 11, 12, 13, 14, 13, 12, 13, 14, 15, 16, 17, 16, 17, 16, 15, 16, 17, 18, 19, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 19, 20, 21, 22, 21, 20, 19, 18, 19, 20, 21, 20, 21, 22, 23, 22, 23, 22, 23, 22, 23, 24, 25, 26, 27, 28, 27, 28, 27, 28, 29, 28, 29, 30, 31, 32, 31, 30, 31, 30, 31, 30, 29, 30, 29, 30, 29, 28, 27, 26, 27, 28, 27, 26, 25, 26, 27, 28, 29, 28, 27, 26, 25, 24, 23, 24, 25, 24, 23, 24, 23, 24, 23, 24, 25, 24, 25, 26, 25, 24, 23, 24, 25, 24, 25, 26, 25, 26, 25, 24, 25, 26, 27, 28, 29, 28, 27, 28, 27, 28, 29, 28, 29, 30, 31, 30, 31, 30, 31, 32, 31, 30, 29, 28, 27, 28, 29, 30, 29, 28, 29, 30, 31, 32, 33, 34, 35, 34, 35, 36, 35, 36, 37, 36, 35, 34, 35, 36, 35, 34, 33, 34, 35, 36, 37, 38, 37, 36, 37, 38, 37, 38, 39, 40, 39, 38, 39, 38, 37, 38, 37, 36, 37, 36, 37, 36, 35, 36, 35, 36, 37, 36, 37, 38, 37, 36, 35, 36, 37, 36, 35, 36, 35, 36, 35, 34, 33, 34, 33, 34, 33, 34, 35, 34, 33, 32, 31, 32, 31, 32, 31, 30, 31, 32, 31, 30, 29, 28, 29, 28, 27, 28, 27, 26, 25, 24, 25, 26, 27, 28, 29, 30, 31, 30, 29, 30, 29, 30, 31, 30, 31, 30, 31, 32, 33, 34, 35, 34, 35, 36, 35, 34, 33, 32, 31, 30, 31, 30, 31, 30, 31, 32, 31, 32, 33, 34, 35, 34, 33, 32, 31, 32, 31, 32, 31, 32, 33, 34, 33, 34, 33, 32, 31, 30, 29, 30, 29, 30, 31, 30, 31, 32, 33, 32, 33, 34, 35, 36, 37, 36, 37, 36, 37, 38, 39, 40, 41, 42, 41, 42, 41, 40, 39, 38, 39, 38, 37, 38, 39, 40, 39, 38, 37, 36, 37, 36, 35, 36, 37, 38, 39, 40, 41, 40, 39, 40, 41, 40, 39, 40, 41, 42, 41, 42, 43, 44, 45, 46, 45, 44, 45, 44, 43, 44, 43, 42, 43, ...]
In [ ]: