יום חמישי, 19 ביולי 2012

"עליסה בארץ הפלאות" או: מציאת היום בשבוע לפי התאריך

"עליסה בארץ הפלאות" או: מציאת היום בשבוע לפי התאריך

(פוסט קצת ארוך, אבל שווה קריאה...)

לואיס קרול (או בשמו המקורי: צ'רלז לאטוויג' דודג'סון) ידוע כמחבר אחד מסִפרֵי הילדים המפורסמים ביותר: "עליסה בארץ הפלאות" ("Alice's Adventures in Wonderland").
בנוסף לספרי ילדים,  הוא התפרסם גם ככותב שירי "אִי-גָיוֹן" (nonsense), כצלם (בעיקר של ילדות קטנות, גם בעֵרוֹם...) וגם כממציא.
אבל לואיס קרול היה גם מתמטיקאי גדול. הוא כתב מספר ספרים חשובים במתמטיקה ובלוגיקה, וגם המציא משחקים, חידות ושעשועים מתמטיים.
(מי שמתעניין בפן המשעשע של הגאון הזה, מוזמן לקרוא את הספר מאת: Martin Gardner:
The Universe in a Handkerchief, Lewis Carroll's Mathematical Recreations, Games, Puzzles and Word Plays)

לואיס קרול גם המציא שיטה משלו למציאת היום בשבוע לפי תאריך נתון. לא נציג אותה כאן (היא נמצאת בספר המוזכר לעיל), אבל האלגוריתם שלה הוא הבסיס לשיטה שפיתח המתמטיקאי John Horton Conway[שיטה המוכרת בשם: [Doomsday Algorithm

שיטה קוֹנוֵוי דורשת שינון של תאריך בכל חודש בשנה, כלומר 12 תאריכים ולכן לא נשתמש בה.
הסבר על שיטת קונווי ראה בקישור: http://www.theworldofstuff.com/other/day.html

בשיטה שאציג (ואשר בה השתמשתי לבְנִיַת הנוסחא שפיתחתי ב"אקסל") - אין צורך לזכור שום תאריך.
את קובץ ה"אקסל" שבניתי לפי השיטה אפשר להוריד כאן:
כאמור, לא צריך לזכור שום דבר כדי לחשב את היום בחודש, אך יש מספר שלבים לשיטה:

הערות על השיטה:

א. השיטה מתבססת על העובדה שבשבוע יש שבעה ימים ואם "נתרגם" תאריך לימים ונחלק ב-7, נוכל לדעת באיזה יום בשבוע הוא חל.
במתמטיקה, מודולו 7 (MOD 7), נותן את השארית המתקבלת מחלוקת מספר ב-7. למשל:   אם נחלק את המספר 27 ב-7, נקבל שארית  6 (27=3*7+6). בחשבון מודולרי הסמון הוא: 27 6(MOD 7)
[ב"אקסל" נשתמש בפונקציה MOD=MOD(27,7) והתוצאה: 6]

ב. מחזוריות חִשוּב היום בשבוע מתרחשת אחת ל- 400 שנה. כלומר: בהפרש של 400 שנה בדיוק, נקבל אותו יום בשבוע. עובדה זו היא בעצם הבסיס לכל האלגוריתם.
לדוגמא: 1.1.1600 ו-1.1.2000חלים באותו יום בשבוע: שבת.
משום כך, אין צורך לחשב את כל המאות מאז תחילת הספירה. מספיק אם נתחיל בשנת 1600.

ג. שנה מעוברת (Leap Year) בלוח הגרגוריאני [לוח השנה המקובל בכל העולם משנת 1582] היא שנה המתחלקת ב-4 ללא שארית או מתחלקת ב-400ללא שארית. (אבל שנה המתחלקת ב-100 ללא שארית: 1700, 1900,1800... איננה שנה מעוברת)
בשנה מעוברת מוסיפים יום אחד לחודש פברואר , שבו 28 ימים בשנה רגילה.

הסבר על השיטה באנגלית אפשר למצוא כאן:

שלבי השיטה:
1. מחלקים את התאריך ל-4 קבוצות: מאה, שנה, חודש, יום.
לדוגמא, אם התאריך הוא 1.1.1999, אז:
המאה= 19, השנה = 99, החודש = 1, היום  = 1

2. קבוצת החודש-  מחשבים את מספר הימים המצטבר עד החודש הקודם בשנה (לא מעוברת).
ינואר = 0, פברואר = 31, מרץ = 59, אפריל = 90, מאי = 120, יוני = 151, יולי = 181, אוגוסט = 212, ספטמבר = 243, אוקטובר = 273, נובמבר = 304, דצמבר = 334

3. קבוצת המאה
בשנת מאה מעוברת (1600, 2000, 2400...) נוסיף: 125 ימים (יום לכל שנה, כמו בקבוצת השנה+ 25 ימים לשנים מעוברות).
בשנת מאה לא-מעוברת (1700, 1800, 1900, 2100...) נוסיף רק 124 ימים.
לכן,
כשהמאה =16 או 20 - נוסיף 125 ימים
כשהמאה = 17 או 21 - נוסיף (125+124)=249
כשהמאה = 18 או 22 - נוסיף (125+124+124)=373
כשהמאה = 19 או 23 - נוסיף (125+124+124+124)=497

4. קבוצת השנה
מסכמים את השנה ואת מספר השנים המעוברות עד אותה שנה מתחילת המאה.
כל שנה מתחילה יום אחד מאוחר יותר מקודמתה =1(MOD(365,7 [בתנאי, כמובן, שהשנה הקודמת איננה שנה מעוברת].
לדוגמא: 1.1.2010 חל ביום ששי, 1.1.2011 חל ביום שבת, 1.1.2012 חל ביום ראשון.
לכן,  כדי לחשב את השנה מוסיפים את מספר השנים בקבוצה זו. כמו-כן, יש להוסיף את מספר השנים המעוברות עד אותה שנה.
במקרה שלנו, שנת 99, התוצאה תהיה: 99 + 99/4 = 99 + 24 = 123

5. קבוצת היום
לא מבצעים שום פעולה אריתמטית....התוצאה = מספר הימים. במקרה שלנו: 1
לכן, יש לבדוק בשנה מעוברת אם התאריך חל לפני ה-1 במרץ באותה שנה. אם כן - יש להחסיר יום אחד.

6. כעת מסכמים את כל הקבוצות ואת התוצאה מחלקים ב-7
השיטה מבוססת על מספור הימים בשבוע מ-0 ועד 6: יום ראשון=0, יום שני = 1,... יום ששי =5, יום שבת = 6. לכן, לתוצאה הסופית, לאחר החלוקה ב-7, נוסיף 1.

יום + חודש + שנה + מאה = 1 +  0 + 123 + 497= 621
=MOD(SUM(1,0,123,497),7)+1=6

לכן, התאריך 1.1.1999 חל ביום ששי.


להורדת  קובץ ה"אקסל" :

(לחץ על: File*Download – או: CTRL+S)


אין תגובות:

הוסף רשומת תגובה