當前位置: 華文問答 > 科學

如果存在一個使用九進制的文明,那麽它們會在何時有奇數和偶數的概念?

2022-11-29科學

先寫結論: 九進制對文明來說其實是非常不錯的進制,雖然可能不如八進制、十六進制、十二進制,但和十進制可能半斤八兩,如果按照九進制生活,文明的數學發展水平發展速度並不會和十進制有太大的差異,至於奇數和偶數的概念,更是很早能被發現的,不值一提。

不妨我們 身臨其境 一下,以下內容均為 九進制文明視角

為了描述方便,在這個視角下,不存在「九/9」這個稱謂,所有「九」的稱謂都被讀作「十」,所以這個文明也自稱使用「十進制」。而這個世界中的「百」、「千」、「萬」即代表了人類十進制下的 81、729、6561……


【再次提示】:請務必忘記人類使用的十進制!

1)算數

1a)乘法口訣

首先是這個文明中裏耳熟能詳的 「八八乘法口訣表」:

八八乘法口訣表

據說小孩子們最喜歡的口訣是「六六四十」,聽起來就很順。

為了提升孩子們的算術水平,學校組織學生們去參加了「四張撲克牌算 26 點」的活動,當然,算多少點還是有點爭議,畢竟大家太熟悉 3 的倍數了,有老師建議「算 22 點」是更合適的,這能鍛煉孩子們對 2 、5 的倍數的理解。

這個文明有一個著名的小說叫「東遊記」,棠僧經歷了八八七十一難才取到真經。

1b)數的整除

對於這個文明,3 和 6 是這個世界最耳熟能詳的數位,畢竟這些數的倍數末尾都是 3、6、0。

另外比較有名的說法是「卅數」「丗數」「川數」,這個說法比「奇數」、「偶數」更出名。

「卅數」是指除以 3 余數為 1 的數,也即末尾為 1、4、7 的數;
「丗數」是指除以 3 余數為 2 的數,也即末尾為 2、5、8 的數;
「川數」是指能被 3 整除 的數,也即末尾為 3、6、0 的數;

早年的數學研究很多就是圍繞著「卅數」和「丗數」展開的。

當然,由於這個國家的性別依舊是 2 個,很快也誕生了「奇數」和「偶數」的概念:偶數是 2 的倍數,奇數不是 2 的倍數。

怎麽看一個數是奇數還是偶數呢?

先說一個概念叫「奇數因子」:1、3、5、7。

然後對於不小於兩位的數,我們就看「奇數因子」有幾個,如果有奇數個,那這個數就是奇數,比如 1 2、4 7 333 、6 5 6……反之就是偶數,比如 35 、40、 57 6、 7 28 1 ……

小學數學老師會告訴你,有一個巧妙的方法,可以迅速判定一個數是否為 2、4、8 的倍數: 看它們的數位和是否為 2、4、8 的倍數 。在數學比較好的國度中,8 的倍數們:8、17、26、35、44、53、62、71 都是耳熟能詳的。

3 的倍數就不講了。判斷一個數是否是 6 的倍數的方法,就是先看末尾是不是 0/3/6,再看看是不是 2 的倍數。

至於一個數是否為 5、11 的倍數,小學奧賽老師會告訴你:看這個數奇數位的和與偶數位的和之差是否為 5、11 的倍數。比如 5478,個位和百位的和 4+8=13;十位和千位的和 5+7=13,所以這個數是 5、11 的倍數。再比如 35634,奇數位之和 3+6+4 =14;偶數位之和 5+3=8,而 14-8=5,因此 35634 是 5 的倍數,但不是 11 的倍數。

至於一個數是否為 7,14,15 的倍數,一般是超綱內容。超微資深一些的老師會告訴你,有一個簡便一些的判別方法,註意到 888 是 7,14,15 的倍數(888=8×7×14=4×14×15),可以將一個大數每 3 位一分割,然後求和,如果這個是 7,14 的倍數,原數也是 7,14 的倍數。

舉個例子:23456122,我們先算出:23+456+122= 612,612/7=78 是 7 的倍數,因此 23456122 是 7 的倍數。

1c)電腦數學

後來誕生了電腦。這個文明對 3 更熟悉,因此一開始電腦是 3 進制的,畢竟 3 進制表示數據是非常高效的。但後來發現,3 狀態的元器件造價太貴,2 狀態的元器件要便宜得多,掙紮了十幾年後,終於還是把電腦換成了二進制的。

程式設計師們對 2 的冪次非常熟悉:2,4,8,17,35,71,152,314,628,1357……

考慮到 2 的 10 次方是 628,所以每年的 6 月 28 日被認為是「程式設計師節」。

人們發現 2 的 11 次方是 1357,一個這麽偶數的數,居然每一位都是奇數,還是等差數列,太神奇了!

人們還發現 2 的 21 次方為 878162,這個數和 1000000 僅僅差了 1.07%,非常接近。

於是 1MB = 2^21 B = 878162 B


2)數論

2a)質數

這個國家同樣對數論感興趣,他們比較熟悉 100 以下的 24 個質數:

2、3、5、7、12、14、18、21、25;
32、34、41、45、47、52、58、65、67;
74、78、81、87。

100 以內最大的質數是 87。

有意思的是:對於大於 3 的質數,卅數和丗數各有 11 個,很均衡。

業余數學家費牛發現:

  • 2^2^0 + 1 = 3
  • 2^2^1 + 1 = 5
  • 2^2^2 + 1 = 18
  • 2^2^3 + 1 = 315
  • 2^2^4 + 1 = 108808
  • 都是質數。於是他猜想,2^2^n + 1 都是質數。

    但後來人們發現,2^2^5 + 1 = 12068657455 = 782 × 13542217,這個數不是質數!

    這個世界裏還有一個很著名的數論入門題,它常常用來辨識一個人有沒有數論天賦:

    111111……(n個1) 是不是質數?

    沒有數論天賦的人,可能絞勁腦汁很久都想不出來。但是著名天才數學家低斯,10 歲的時候就用巧妙的方法解決了。

    要不你也來試試?

    提示:分奇數和偶數討論,在這個世界裏 10=3×3。

    2b)走馬燈數

    在這個文明裏,人們也會研究其他進制,發現在其他進制中,普遍存在「走馬燈數」,也就是說,這個數的倍數會是這個數所有數位的重新組合,而且順序也不變,只是起點和終點變了。

    比如:

  • 3 進制下的 0121,它的倍數為 1012,1210,2101;
  • 5 進制下的 032412,它的倍數為:120324,203241,241203,324120,412032;
  • 6 進制下的 0313452421,它的倍數為 1031345242,1345242103,2103134524,2421031345,3134524210,34524210313,4210313452,4524210313,5242103134;
  • 7 進制下的 1254,它的倍數為:2541,4125,5412;
  • 8 進制下的 1463,它的倍數為:3146,4631,6314;
  • 11 進制下的 142857,它的倍數為:285714,428571,571428,714285,857142;
  • 12 進制下的 0A3425B17685(註意:10=A,11=B);
  • 13 進制下的 24A7,它的倍數為 4A72,724A,A742……
  • 但唯獨 10 進制,似乎沒有這樣的「走馬燈數」。

    後來數學家們發現,因為 10=3×3 是平方數,透過原根的相關知識我們可以證明,在平方數進制下,是不存在走馬燈數的,真可惜!

    2c)黑洞數

    在這個文明裏,雖然沒有人們耳熟能詳的「走馬燈數」,卻有另一個耳熟能詳的數,它是 62853。這個數被成為「黑洞數」。

    黑洞數又稱陷阱數,是類具有奇特轉換特性的整數。任何一個數位不全相同整數,經有限「重排求差」操作,總會得某一個或一些數,這些數即為黑洞數。

    比如 31467,將其重新排序後最大的數是 76431 ,最小的數是 13467 ,相減以後得到 62853;

    然後繼續以上操作:86532 - 23568 = 62853

    咦,居然沒有發生變化?

    這就是黑洞數。

    事實上,已經證明,1~4 位數都不存在「黑洞數」,只能跌入迴圈,於是 62853 是最小的黑洞數。而且,並不是所有的 5 位數都能跌入「黑洞數」的(只有 5210 種初始值可能會跌入這個迴圈,占 5.8%),更大的可能是,跌入一個「大迴圈」(除了 11111 的倍數外,其余情況均是如此):

    74832 -> 63843 -> 52854 -> 60873 -> 83841 -> 74832:

    因此「黑洞數」 62853 顯得彌足珍貴,很多人都把它設定成密碼。

    程式碼參見附錄

    3)小數

    3a)小數的性質

    在該文明的「知也」上,數學區會有一個月經問題:0.8888888…… 是否等於 1 ?

    有一個高贊回答是:註意到 1/2 = 0.4444444……,因此 1/2 × 2 = 0.888888…… 所以 0.888888…… 等於 1 。

    也對,這個文明的小數發展的更早,畢竟 1/2 = 0.444444……,所以人們很早就發現了「迴圈小數」。

  • 1/2=0.44444444……
  • 1/3=0.3
  • 1/4=0.2222222……
  • 1/5=0.1717171717……
  • 1/6=0.1444444……
  • 1/7=0.125125125……
  • 1/8=0.111111111……
  • 在進行 10 以下的等分時,迴圈節最多 3 位,也比較容易記憶,數學老師會要求背誦下來。

    3b)圓周率

    關於「圓周率」,一開始,人們認為圓周率大概比 3.12 稍微大一點。

    巍國數學家劉輝在自己的【八章算數】裏仔細研究了下,認為圓周率等於 3.1242,這個數大概是能被整除的。

    後來錦國的科學家孫退乎利用「割圓術」,發現劉輝的結果不太精確。他算出圓周率在 3.1241881~3.1241882 之間。

    並且給出了兩個近似值:

  • 一個叫做「約率」:24/7 ≈ 3.125125,
  • 一個叫做「密率」:434/135 ≈ 3.12418824,前 6 位都是正確的。
  • 人們發現,圓周率小數點後前 7 位的每一位都是 2 的冪次,人們認為這應該不是巧合。因此認為圓周率後的每一位可能都是 2 的冪次。

    直到一千年後,數學大發展,計算圓周率的方式也被進一步最佳化了,人們發現圓周率後第 12 位是 7,推翻了這一猜想。

    現在人們知道,圓周率大約是 3.124188124074427883……

    3c)其他常數

    後來,科學家發明了對數。定義如果以 10 為底的對數為 lg

    於是 lg2≈0.275, lg3=1/2≈0.444,lg5≈0.653

    後來馬頓發明了微積分,但與此同時祛拳尼茲也獨立發現了微積分,兩個人大吵一架,不歡而散。

    不過這不重要,重要的是,大家發現 e ≈ 2.641557364 這個數似乎也是一個超越數。

    註:以上只是該文明的內容提綱,後續內容可以參見專欄系列文章:

    附錄:「黑洞數」計算程式碼(好久沒用 python,復習一下):

    # Calulate the Blackhole Number in Base n # Author: PlusZeng # Date: created: 2022/12/4, modified: 2022/12/19 import math def list2chr ( a , n ): tmp = '' if n <= 10 : for i in a : tmp += str ( i ) if n > 10 : for i in a : if i < 10 : tmp += str ( i ) elif i < 36 : tmp += chr ( i + 55 ) elif i < 62 : tmp += chr ( i + 61 ) else : tmp += '(' + str ( i ) + ')' return tmp def root_10_to_n ( x , n , x_digit ): result = []; p = n ** ( x_digit - 1 ); while ( p >= 1 ): result . append ( math . floor ( x / p )) x %= p ; p /= n ; return result def minus_hole ( x , root_n , x_digit ): y_min = sorted ( x ); a_max = 0 ; a_min = 0 ; for i in range ( 0 , x_digit ): a_min += int ( y_min [ i ]) * root_n ** ( x_digit - i - 1 ) a_max += int ( y_min [ i ]) * root_n ** i return root_10_to_n ( a_max - a_min , root_n , x_digit ) def cal_hole_in_base_n ( x_digit , n ): cirDict = {}; for i in range ( n ** ( x_digit - 1 ), n ** x_digit ): numList = []; numList . append ( root_10_to_n ( i , n , x_digit )); tmp = 0 ; is_circle = 0 ; while ( is_circle == 0 ): numList . append ( minus_hole ( numList [ tmp ], n , x_digit )) tmp += 1 for j in range ( tmp - 1 , - 1 , - 1 ): if numList [ tmp ] == numList [ j ]: is_circle = 1 break cirList = list2chr ( numList [ j ], n ) for k in range ( j + 1 , tmp ): cirList += '->' + list2chr ( numList [ k ], n ) if cirDict . get ( cirList ) is None : cirDict [ cirList ] = [ list2chr ( numList [ 0 ], n )] else : cirDict [ cirList ] . append ( list2chr ( numList [ 0 ], n )) for i in cirDict . keys (): print ( i + ' : ' + str ( len ( cirDict [ i ])) + ';' ) if __name__ == '__main__' : print ( 'Input the base: ' ) n = int ( input ()) print ( 'Input the max digits: ' ) x_digit = int ( input ()) for i in range ( 1 , x_digit + 1 ): print ( ' \n ' + str ( i ) + ' digits' ) cal_hole_in_base_n ( i , n ) print ( 'Done!' )