Friday, October 22, 2010

חור שחור מתמטי -- מספרי סיזיפוס


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


נתון מספר, למשל, 982100

1. נספור את מספר הספרות הזוגיות

2. נספור את מספר הספרות האי-זוגיות

3. נספור את מספר הספרות בסך הכול

4. המספר הבא בתהליך הוא זה שמתקבל מ-מספר הספרות הזוגיות כאשר משורשר לו מימין מספר הספרות האי-זוגיות ולבסוף משורשר מימין מספר הספרות בסך הכול.

במקרה שלנו המספר המתקבל בשלב הבא של התהליך יהיה 426, כי יש 4 ספרות סוגיות (0,0,2,8) ושתי ספרות אי-זוגיות (1, 9). יש להבחין שזהות הספרות אינה חשובה, אלא רק הזוגיות שלהן חשובה.

5. ממשיכים לפי ההוראות של השלבים 1-4 שוב ושוב עד אשר מתקבל אותו המספר שוב ושוב ושוב.... זה קורה כאשר מגיעים ל-123.



בהסברים של המקבץ שקיבל אביב ממכון ויצמן הפעם כתוב:

"מספר סיזיפוס כונה 'חור שחור מתמטי' על יד המתמטיקאי מייקל אקר (Michael Ecker) משום שבדומה ל'חור שחור' שמושך את מה שקרוב אליו, המספר הזה "מושך" אליו את כל המספרים השלמים כולם. לא משנה באיזה מספר התחלתי בוחרים - כאשר מבצעים עליו את האיטראציה המתוארת הוא נופל לתוך 'החור השחור המתמטי', מספר סיזיפוס - 123!"

שאלה שמצאה חן בעיני היתה:



מהו מספר השלבים הגדול ביותר האפשרי עד שמגיעים למספר סיזיפוס אם מתחילים ממספר תלת - ספרתי? שימו לב: שלב הוא כל מעבר ממספר למספר שבא אחריו.

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


נתבונן במקרים הבאים:
1. כל הספרות זוגיות (אין בכלל ספרות איזוגיות) -- אז נקבל: 303 -> 123
לכן במקרים אלה יש רק שלב אחד
2. יש רק ספרה איזוגית אחת -- אז נקבל :213 -> 123. גם כאן רק שלב אחד
3. יש שתי ספרות איזוגיות -- אז נקבל: 123 ואין צורך בשלב נוסף
4. יש שלוש ספרות איזוגיות (אין זוגיות בכלל): 033 -> 123
מסקנה: צריכים לכל היותר שני שלבים.

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


התוכנית מקבלת משורת הפקודה שני מספרים, מספר התחלה ומספר סיום, לציון התחום שיש לעבור עליו. למשל, לשאלה שקיבל אביב התחום המתאים הוא 100 עד 999. התוכנית כתובה בשפת Perl.






#!/usr/bin/perl

use strict;

use warnings;

my $from = shift;

my $to = shift;

my $max_iter=0;

foreach (my $i=$from; $i<=$to; ++$i) {

print $i,"\n";

my $num_iter=0;

my @old_r = split '',$i;

while (1){

my @r=iter(@old_r);



last if equals(\@r,\@old_r);

@old_r=@r;

++$num_iter;

print "@r\titeration #",$num_iter,"\n";

$max_iter=$num_iter if $num_iter>$max_iter;

}

print "\n===\n";

}

print "\n\nmax=$max_iter\n";



sub iter {

my $even=0;

my $odd=0;

foreach my $d (@_) {

if ($d%2) {

++$odd;

}else{

++$even;

}

}

return ($even , $odd , $even+$odd);

}



sub equals {

for(my $i=0; $i<scalar @{$_[0]}; ++$i){

return 0 if $_[0]->[$i] != $_[1]->[$i];

}

return 1;

}








תוכנית המחשב אכן אישרה את התוצאה שאליה הגיע אביב בכח המחשבה!

1 comment:

  1. הכל יפה, רק יש כאן אולי טעות קטנה.
    למה כששלושת הספרות הן אי זוגיות מקבלים 033?
    למה לא 00033?
    למה לא סתם 33?
    ההנחה הזו שהמספר המתקבל חייב להכיל 3 ספרות היא בעייתית בעיני.
    לדעתי אם מתחילים ב157 (לדוגמא), אז המספר הבא הוא 33 (ולא 033), המספר הבא הוא 22 (לא 022) המספר הבא הוא 202, אחריו303 ואחריו 123.

    ReplyDelete