在各种文明的算术发展过程中,乘法运算的产生是很重要的一步。一个文明可以比较顺利地发展出计数方法和加减法运算,但要想创造一套简单可行的乘法运算方法却不那么容易。我们目前使用的乘法竖式计算看似简便,实际上这需要我们事先掌握九九乘法口诀表;考虑到这一点,这种竖式计算并不是完美的。我们即将看到,在数学的发展过程中,不同的文明创造出了哪些不同的乘法运算方法,其中有的运算法甚至可以完全抛弃乘法表。
古巴比伦数学使用60进制,考古发现的一块古巴比伦泥板证实了这一点。这块泥板上有一个正方形,对角线上有四个数字1, 24, 51, 10。最初发现这块泥板时人们并不知道这是什么意思,后来某牛人惊讶地发现,如果把这些数字当作60进制的三位小数的话,得到的正好是单位正方形对角线长度的近似值:1 + 24/60 + 51/60^2 + 10/60^3 = 1.41421296296… 这说明古巴比伦已经掌握了勾股定理。60进制的使用为古巴比伦数学的乘法运算发展带来了很大的障碍,因为如果你要背59-59乘法口诀表的话,至少也得背1000多项,等你把它背完了后我期末论文估计都已经全写完了。另一项考古发现告诉了我们古巴比伦数学的乘法运算如何避免使用乘法表。考古学家们发现一些泥板上刻有60以内的平方表,利用公式ab = [(a+b)^2 – a^2 – b^2]/2 可以迅速查表得到ab的值。另一个公式则是ab = [(a+b)^2 – (a-b)^2]/4,这说明两个数相乘只需取它们的和平方与差平方的差,再两次取半即可。平方数的频繁使用很可能加速了古巴比伦人发现勾股定理的过程。
古巴比伦数学把除以一个数看作是乘以它的倒数,利用倒数表可以很方便的实现这种算法。倒数表开头的一部分是这个样子:
2 0; 30
3 0; 20
4 0; 15
5 0; 12
6 0; 10
8 0; 7, 30
9 0; 6, 40
10 0; 6
12 0; 5
15 0; 4
16 0; 3, 45
18 0; 3, 20
20 0; 3
…. ….
古巴比伦人很早就发现,1/7是一个无限小数,怎么除也除不完。古巴比伦的倒数表里所有的数都是精确的小数,它们(在60进制中)都是有限小数。碰到无限小数时,他们会用取近似值的方法来解决。例如,古巴比伦人会通过1/13 = 1*(1/13) = 7*(1/91) ≈ 7*(1/90) = 7*(40/3600) = (7*40)/3600 来计算1/13的值。那个40就是查倒数表查出来的。
古埃及数学使用了完全不同的乘法运算法。它们的乘法运算不需要借助任何辅助用表。古埃及人注意到,任何一个数都可以表示为若干个不同的2的幂的和。因此,你需要做的仅仅是不断将1和乘数进行翻倍。看看古埃及人如何计算46乘以22:
46 x 22 = 1012
1 22
2 44 44
4 88 + 88
8 176 + 176
16 352
32 704 + 704
——-
1012
上面的演算中,左列是1不断翻倍的结果,右边是22不断翻倍的结果。选出左列的2, 4, 8, 32,它们的和正好就是被乘数46;那么把右列对应的数加起来就是乘法运算的最终结果。至于如何选出2, 4, 8, 32这四个数,一个简单的方法就是,不断选出左列里小于被乘数的数中最大的一个,然后当前被乘数减去它。比如,32是最大的数,用46-32后剩14;8是小于14的最大数,14-8后剩6;然后最大的小于6的数是4,6减去4后剩2,这样下来2+4+8+32正好就是被乘数46了。这其实就是二进制的经典应用,2, 4, 8, 32正好与46的二进制中的数字1一一对应。你可以在这里看到一些相关的东西。
无独有偶,据说俄国农村曾产生过这样一种乘法算术法:将被乘数逐次减半,同时乘数依次加倍,那么找出所有左边的数是奇数的行,其右列的数的和就是答案。例如,下面的例子中,23, 11, 5和1都是奇数,于是右边对应的44, 88, 176和704的和就是乘法运算的结果。这个做法与古埃及的算术法完全一样,但看起来似乎更神奇一些。
46 x 22 = 1012
46 22
23 44 44
11 88 + 88
5 176 + 176
2 352
1 704 + 704
——-
1012
做人要厚道
转贴请注明出处
哈哈 沙发[cool]
古巴比伦人应该也有10进制的。
不过不知道为啥他们便爱60进制,10个指头很形象的,
难道也和宗教有关?
神话般的王国,迷一样的文明,只剩下羚羊在草原上奔跑。
现代文明也会和许多史前文明一样归于尘土。
试了试神奇的俄国算法,试验结果表明,该算法成立的充分必要条件是:被除数必须是偶数.
下面是ruby代码,按照本文最后给出的算法写的,很简单:
—–性感的分割线—-
class Fixnum
alias mm *
def *(b)
sum=0
a=self
begin
a >>= 1
b = b+b
sum += b if a&1==1
end while a!=1
return sum
end
end
puts 82*67 # right
puts 82.mm(67) #right
puts 67*82 # wrong
puts 3*1 # wrong
puts 3*2 # wrong
puts 2*3 #right
puts 2*2 #right
回复:看来是我没写清楚。被乘数本身也要算一行的。现在我把这行加上了
while a>=1要好点.
俄国算法如何处理:
3*1=?
自问自答:
3*1=(4-1)*1[redface]
—贴点最后那个俄国算法的ruby代码,留个纪念—
def m(a,b)
if a<0 #负数
return -m(-a,b)
end
if a&1==1 #奇数
return m(a+1,b)-b
end
sum=0
begin
a>>=1
b+=b
sum+=b if a&1==1
end while a>=1
return sum
end
puts m(6,7)
puts m(7,6)
class Fixnum
def *(b)
return m(self,b)
end
end
puts 67*82
俄国的算法当然被乘数要求为偶数了。
按照上述算法:
偶数:46*22=2进制(101110)*22
奇数:45*22=2进制(101100)*22,再加上2进制的(0001)*22即可。
这么看俄国的算法奇数也可以.
如果被乘数是奇数,那么本身式子的乘数也要加一遍.
RSS(Google Reader) 收文不能
回复:?
膜拜中国优秀的古汉语,那个乘法口诀表,好背啊!而且是十进制的,爽!
还是中国的10进制爽
留言板你好像不常看,只好在这里问你个问题了,在你的影响下我也改用Ubuntu了,光为了ATI的驱动就折腾了三天,最终还是没有成功,我的是X1300。我现在问你,为什么我用Lazarus单步后,显示Debugguing,但是不显示窗口,不能输入,也看不到输出,只能用文件才能正常输入输出,怎么回事?
回复:我用fpc+emacs+gdb,不用Lazarus,没法回答你的问题了
感觉我怎么像在审问你???不好意思啊。麻烦回答下。
说道角度的60进制问题,我还看到过一种说法,说是因为古人观察到太阳从升起到落下,在空中走刚好过了30个太阳的距离,也不知道这个说法可不可信。
~~~关于乘法的计算,刚好是2进制和10进制的混用哈~~~
0。0前几天在”Number theory and its history” 里面看到一样的东西鸟!
好吧,拆分计算也是一样的结果。