漫話進位制

來源:互聯網
上載者:User

  人有十個手指,用手指的伸屈來計數非常方便。但一旦對象的數目超過10個了,手指頭就不夠用了。當然,有人會想到還有腳趾頭。搬弄腳趾頭是不現實的,數手指頭只需要站著比劃一下就可以了,數腳趾頭還需要坐下來慢慢研究。一種好的方法是每次數完了十個指頭後在什麼地方做一個標記,比如在地上放一個木棒。人們可以把這根木棒想像成一個“大指頭”,它相當於十個指頭。這樣,我有37個MM就被表示成了地上3個木棒加上我7個手指頭。哈哈,你的MM數只有兩根木棒加4個手指頭,於是我的MM比你的多。久而久之,人們就只接受0到9這十個數字了,再大的數就用幾個數字合起來表示。這種“滿十進一”的數字系統就叫做十進位制。
    如果人只有八個手指頭又會怎樣呢?那我們現在很可能正在使用八進位,數學發展起來後我們最終只接受八個數字,而大於8的數字就用更高一級的計量單位表示。代表這八個數位很可能是些星際之門裡的怪符號,這裡為了便於敘述,我們仍然使用阿拉伯數位0到7來表示。於是,人類數數的方式將變為:0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20,...。這裡,數字8被記作10,數字64則用100代替。在這個數學世界裡,6+5=13,因為6+1得到的數已經是一位元中最大的了,再加的話只能“進一位”了。“滿八進一”將成為數學運算的基本法則。
    如果人有12根手指,12進位將成為更難想像的事。在12進位中,人類會把10和11直接想成是一個“數字”。研究的進位制大於10時,大於9的數字我們習慣上用大寫字母ABC來表示。這樣,自然數序列裡將多出兩個符號A和B來,數數的方式變為...,8,9,A,B,10,11,12,...。

    我們自然會想,人類生活中究竟有沒有其它的進位制呢?當然有。比如,時間和角度就是60進位制,60秒=1分。還有更怪的,電腦的儲存容量單位是1024進位的,1MB=1024KB。當然,這也是有原因的。我們在研究幾何時常常需要用到1/2,1/3,1/4或者1/6,我們希望這些分數在角度進位下恰好都是整數以便於運算。於是,角度的進位制就變成了60。為什麼時間也是60進位制呢?因為時間和角度密切相關,你看看你的手錶就知道了(別告訴我你的手錶是數字型的)。為什麼鐘和手錶又要用圓形錶盤的方式來表示時間呢?其實人自古以來計算時間都是用的圓形盤面,因為地球繞太陽旋轉和地球的自轉使得時間具有了周期性。
    電腦使用二進位,因為電腦元件只有兩種狀態(開和關,或者說通電和斷電),因此電腦只認0和1兩個數字。1024是2的冪,又比較接近1000符合人的習慣,因此把1024當成了電腦容量的進位制。

    前段時間有人在OIBH上問,為什麼紙幣的面值都是1*10^n、2*10^n、5*10^n呢。有人回答說這樣的貨幣系統可以使得某種貪心方法正確。確實有這個結論,這樣的貨幣系統使得解決“湊錢和找零時最少使用多少張紙幣”這一問題的貪心演算法(不斷拿最大面額的紙幣)是正確。但用這一點來解釋我們的問題顯然是可笑的,人們首先考慮的並不是如何方便地使用最少紙幣,而是如何方便地得到總面額。一個只有1元紙幣和7元紙幣的貨幣系統同樣滿足貪心性質,但顯然傻子才會設計出這種彆扭的貨幣系統來。因此,我的回答是“紙幣的面值取10的約數,這樣的話湊錢和找零最方便”。但是,有人會問,要是我們使用的進位制不是10怎麼辦?換句話說,如果我們使用的是23進位制,除1和本身外沒有其它約數的話,又該怎樣設定貨幣系統呢。答案非常出人意料,如果我們使用的是23進位制的話,我們很可能根本發展不出數學這門學科來。10=1+2+3+4,是前四個正整數的和;10又是2和5的積;這樣的進位制非常適合數學的發展。同樣地,6=1+2+3,6=2*3,因此可能正在使用六進位的昆蟲們很容易發展出數學來(六足動物的數學非常強,不是有人發現了蜜蜂蜂巢的六邊形樣式設計是最科學的麼)。大家看過《電腦中的上帝》(Calculating God)嗎?那裡面構造了這樣一種生物:他有23根手指。這種彆扭的數字最多隻能讓人聯想到喬丹和染色體,除此之外沒有任何特性。這給這種生物的數學發展帶來不可逾越的困難。而事實上,這種生物恰好又沒有發展數學的必要性。他就好像人類一樣,對較小的物體個數具有直接感知的能力。人類可以直接感知的物體數量一般不超過6。也就是說,如果你眼前有3個,或者5個東西,你不需要數,看一眼就知道有多少個;但當你眼前出現的物體數目達到7個或者8個時,你就必須要數一數才知道個數了。而我們所說的生物面對的物體數目多達46個時仍然可以一眼分辨出多少來,數目超過46後就統稱為“很多”了。直接感知數目達到50甚至60多的生物個體就扮演著該種族中的僧侶角色。46這個數字對於種族的生存已經完全足夠了,他們在組建部落時總會保證部落的個體數不超過這個數字。因此,這種生物不需要數數的能力,他們也就無鬚髮展數學了。他們不知道30加30等於多少,從某種意義上說他們甚至不知道一加一等於幾,因為他們頭腦中根本沒有數字這個概念。作為一種補償,他們對事物的感知能力相當敏銳。他們甚至直接憑直覺感知到了相對論,因為他們的思維不受演繹邏輯的束縛。

    下文將介紹兩套進位轉換的方法,然後介紹這兩套方法在小數轉換上的應用。更多的進位制相關應用你可以在文後的習題部分中體會到。

    在講進位制時,大多數教材會教大家二進位和十進位如何互換。今天我就偏不這樣講,我要和那些教材講得一樣了我還不如不寫今天這些東西。二進位雖然常用,但比較特殊,很可能會了二進位但仍然不會其它進位;我們今天當一回蜜蜂,看看六進位和十進位怎麼互相轉換。學會這個後,任意進位間的轉換你就應該都會了。
    說起進位制時往往要回到最根本的一些計數方法上。這篇日誌是我第237篇日誌。數字“237”表示兩個百,加上三個十,加上七個單位一。我們把它們分別叫百位、十位和個位,同一個數字在不同數位上表示的實際數量不同。用一個式子表示上面的意思就是,237=2*100+3*10+7。這就是進位制的實際意義。
    現在,假如我是一隻勤勞的蜜蜂。我寫237篇日誌是肯定不可能的了,因為我的數學世界雷根本沒有7這個數字。那就說我寫了235篇日誌吧。結合前面所說的東西,“十位”上的數表示有多少個6,“百位”上的數表示有多少個36(後面提到的十位、百位打引號表明這不是十進位中的“十”和“百”)。於是,六進位下的235就應該等於2*6^2+3*6+5。這個算式你用什麼進位算出答案就相當於把六進位中的235轉換為了什麼進位。不過你要把這個式子當成別的進位算是不大可能的,算之前你估計得重新背一遍乘法口訣表(注意我為什麼不說是“九九”乘法口訣表)。這就是我們為什麼一般只研究十進位與其它進位互換的原因。我們用熟悉的十進位進行計算,得出2*6^2+3*6+5=72+18+5=95。這是按定義進行進位轉換的方法。六進位的235等於十進位的95,我們記作(235)6=(95)10。那個6和10是下標,應該像H2O的2一樣小小地寫在下面。我就懶得排版了,反正轉貼個幾次就成Plain Text了。
    下面的任務是,考慮怎麼把(95)10變回(235)6。使用六進位計算13*10+5可以得到235(十位上的9相當於六進位中的13),但我們說過六進位計算很麻煩。下面我們給出一種把十進位轉換為六進位的方法,仔細思考你會發現這種方法顯然是正確的。我們把所有6的冪從小到大寫出來:1,6,36,216,...。216遠遠超過95了,因此95的六進位不可能是四位元。95裡面有兩個36,因此在最高位上寫個“2”。去掉兩個36,95裡只剩23。23裡有三個6,數字3將填寫在第二位上,去掉這三個6最後所剩的5留給最末位。換句話說,我們不斷尋找最大的x使得6^x不超過當前數,當前數減去6^x並在右起第x+1位上加一。這事實上是前面六進位轉十進位的逆過程。
    上面的進位互換方法是一套方法,這是我們所介紹的第一套方法。這套方法的特點是正確性很顯然,但是計算比較複雜,又費馬達又費電。我們需要一個計算更方便的進位轉換方法。下面介紹的就是進位轉換的第二套方案。

    再一次回到一個很基礎的問題:在十進位中,為什麼乘以10相當於在數的末尾加一個0?我們同樣會聯想到位元運算:為什麼二進位左移一位(末尾加一個0)相當於乘以2?事實上,這個結論普遍存在於所有進位制中:k進位數的末尾加個0,相當於該數乘以k。證明方法非常簡單,乘以一個k就相當於進位制展開式的每個指數都加一,也就相當於所有數字左移一位。六進位235=2*6^2+3*6+5,乘以6的話式子將變為2*6^3+3*6^2+5*6,也即2350。利用這個性質,六進位235可以很快轉為十進位:235相當於2後面添0,加上3,再添一個0,再加上5,寫為算式即(2*6+3)*6+5=95。把(2*6+3)*6+5展開來,得到的式子和前面的那種計算方法(2*6^2+3*6+5)一模一樣,但這裡的計算方式更簡便一些。如果寫成程式,六進位字串t轉為十進位數a只需要一句話就可以完成:
for i:=1 to length(t) do a:=a*6+ord(t[i])-48;
    使用這種方法將十進位變回六進位是一個徹頭徹尾的逆向操作:當前數不斷除以6並把餘數作為新的最高位。比如,95除以6等於15餘5,餘數5就是個位,15除以6的餘數3作為“十位”,最終的商2是“百位”。這叫做短除法,是最常見的方法,網上隨處可見。

    下面說一下進位制中的小數。前面的東西如果理解了,小數進位的轉換將順理成章地進行下去。六進位中的0.1相當於十進位的1/6,因為六進位中的0.1、0.2、0.3、0.4、0.5五個數把區間0到1均分為了6分。同樣地,(0.05)6=(5/36)10。你會發現,一個“十分位”代表1/6,一個“百分位”代表1/6^2,之前的很多結論仍然成立。六進位小數12.345就等於1*6^1+2*6^0+3*6^(-1)+4*6^(-2)+5*6^(-3),通過負指數把進位轉換的整數部分和小數部分聯絡在了一起。(12.345)6轉為十進位後居然變成了無限小數,其實這並不奇怪,這隻是一個約數的問題:同樣是三分之一,在我的六進位下正好分乾淨(0.2),但在你十進位下就總也分不完,總要剩一點留給下一位(0.333333...)。這裡有一些小數進位轉換的執行個體。可以看到,一個進位下的有限小數很可能是另一個進位下的無限迴圈小數。另一個有趣的例子在這裡
    既然前面所說的第一套方法中六進位轉十進位對於小數仍然成立,那麼第一套方法的十進位轉六進位也可以直接在小數上使用。如果你嫌無限小數很彆扭,用分數進行操作是一種不錯的選擇。具體操作方法和前文敘述一模一樣。針對純小數的進位轉換,我們把前文的描述換種方法再說一遍:不斷尋找最小的正整數x使得1/6^x不超過當前數,當前數減去1/6^x並在小數點後第x位上加一。我就不再舉例子了,下面主要討論第二套方法在小數上的應用。
    我們曾說過,在k進位末尾加0相當於該數乘以k。可惜這對小數沒有用,小數後你加它八百個“0”這個數仍然不變。其實,“末尾加0”只是這種性質反映在整數上的一種現象而已,我們還需要看到更本質的東西(還記得高二哲學麼)。考慮到小數的乘k和除k,不難想到這種性質的實質是小數點的移動,整數的末尾加0其實是小數點向右移動一位的結果。顯然小數也有類似的結論:將k進位小數的小數點左移一位,相當於該數除以k。比如,十進位中3.14除以10就變成了0.314。結論的證明和原來完全相同:除以k後展開式中的指數全部減一,相當於所有數右移一位。有了這個結論,我們的方法就出來了。來看六進位12.345如何轉換為十進位。由於這種方法對整數和小數的處理方法有一些不同,轉進位時我們通常對整數部分和小數部分分別進行操作。先把12轉成十進位的8,然後單獨考慮小數部分。0.345可以看作是數字“5”的小數點左移,加上4後小數點再次左移,再加上3並最後一次左移小數點;寫成算式即((5/6+4)/6+3)/6。展開這個式子,實質與前面的方法仍然一樣。小數部分十進位轉六進位依然是徹頭徹尾的逆向操作:當前數不斷乘以6並取出整數部分寫下來。
    這裡有一個執行個體供大家參考,這個例子中的進位轉換保證不涉及無限迴圈小數。1/4在十進位和六進位下的表示肯定都是有限小數,因為4的唯一一個因子2同樣也是10和6的因子。先看0.25怎麼變成六進位:0.25*6=1.5,取出1,留下0.5;0.5*6=3,沒有小數部分了,因此(0.25)10就等於(0.13)6。現在我再把它變回去:(3/6+1)/6=(0.5+1)/6=1.5/6=0.25。這不是徹頭徹尾的逆操作嗎?

    每年NOIp前總有人問負進位制。事實上,如果你搞清了上面的問題,負進位制將非常好理解。負進位制有一個非常奇特的功能:它可以表示出負數但不需要用負號。一個負進位數可能是負數,也可能是正數。比如,負六進位下的12等於十進位下的-4,而負六進位下的123等於1*(-6)^2+2*(-6)^1+3,即十進位下的27。是正是負取決於位元的奇偶:若該數有偶數位,則該數為負數;若有奇數位,則該數為正數。原因很簡單,小數點每右移一位,相當於這個數乘以-6;從一位元開始,乘奇數次後該數的位元變成偶數且值為負,乘偶數次該數仍有奇數位且值仍為正。由於末尾添0的性質(小數點移位的性質)仍然成立,負六進位與十進位的轉換依然是上面的方法:(123)-6=(1*(-6)+2)*(-6)+3=(27)10。十進位轉負六進位?還是那句話:徹頭徹尾的逆操作。找到最小的非負整數x使得當前數減x能被6整除,這個x將作為新的最高位寫到結果中,然後當前數減去x再除以-6。在這裡我不說“餘數”這個詞,因為當除數為負數時對餘數的定義很模糊。不再舉例子了,例子都舉煩了,自己把(123)-6=...=(27)10那一行倒過去看就是例子了。
    當然,還有更神奇的:-1+i進位可以表示出複數來,因為-1+i的冪有時含有虛數有時不含虛數。運算和轉換依然和上面這些東西一樣,我也就不多說了。

    進位制的問題結束了。我們這裡是以六進位為例進行的說明,但是不要忘記,最有趣的仍然是二進位。與二進位有關的趣味問題遍地都是。舉個例子,你可以在這裡的第三題看到一個二進位的經典應用。

文章最後還是那三句話:
Matrix67原創
轉貼請註明出處
請大家幫忙校對

這次的錯別字可能很多,因為我不是用的紫光,而是用的fcitx,沒辦法使用原來的詞庫了。
講解也可能有漏洞,很多東西是我突然想到,即興寫下的。大家幫忙錯誤修正啊!

附一:四道進位制練習題及其簡略解答
    下面這些題目是在我公布的那個課件裡的,是我收集的一些很不錯的具有代表性的題目,講課時已經用過多次了。

1. 證明:Σ(n=1 to ∞)6^( (2-3n-n^2)/2 )是無理數。
  解答:用六進位表示此數,該數顯然為無理數。

2. 在哪一種進位中,35與58互質?
  解答:由於出現了數字8,因此進位制至少為9。事實上,35和58在任何不小於9的進位制下都互質,因為輾轉相減不會出現“不夠減”的情況,任何進位下最終都得1。

3. 證明:沒有一種進位使三位元aaa恰等於a^3。
  解答:設此數為k進位,則ak^2+ak+a=a^3。此方程無整數解。

4. 在哪一種進位中,792可以被297整除?
  解答:這道題目非常有趣。在任何一種進位下,200的四倍都已經超過792,300的兩倍都還不足792。那麼,792隻可能是297的三倍。設進位製為k,問題轉化為解方程7k^2+9k+2=3*(2k^2+9k+7)。

附二:進位制笑話不完全收集:)

1. What would the value of 190 in hexadecimal BE?

2. If only DEAD people understand hexadecimal, how many people understand hexadecimal?

3. There are only 10 types of people in the world — those who understand binary, and those who don't.

4. There are only 10 types of people in the world — those who understand trinary, those who don't, and those who mistake it for binary.

5. Why do mathematicians think Halloween and Christmas are the same? Because 31 Oct = 25 Dec.

 

Matrix67

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.