|
楼主 |
发表于 2006-8-21 02:40:05
|
显示全部楼层
Post by KevinChen
在第26章--数组的部分--埃拉托色尼素数筛子的代码中
- 64 let i=$LOWER_LIMIT+1
- 65 # 我们都知道 1 是素数, 所以我们从 2 开始.
- 66
- 67 until [ "$i" -gt "$UPPER_LIMIT" ]
- 68 do
- 69
- 70 if [ "${Primes[i]}" -eq "$PRIME" ]
- 71 # 不要处理已经过滤过的数字 (被标识为非素数).
- 72 then
- 73
- 74 t=$i
- 75
- 76 while [ "$t" -le "$UPPER_LIMIT" ]
- 77 do
- 78 let "t += $i "
- 79 Primes[t]=$NON_PRIME
- 80 # 标识为非素数.
- 81 done
复制代码
第64跟65行有问题,首先1不是素数,而且,如果这个算法从1开始算起,肯定没有答案。从2开始肯定不是注解上的原因
还有SPLIT的这个变量没有用过,应该再用在第70行,把那个$UPPER_LIMIT,改成$SPLIT
目前看的最大的BUG,其他的翻译一些错误可能是打字时出错,但是无关痛痒,都看得懂
但是这个BUG是有误导的意思
不知道写的对不对,但是希望有人能看到
多谢兄弟打了这么多字,我来解释一下:
第64跟65行有问题,首先1不是素数,而且,如果这个算法从1开始算起,肯定没有答案。从2开始肯定不是注解上的原因
素数(也叫质数)的定义大家都清楚:只能被1和它自已本身整除的整数(一般指正整数)。
我依稀记得小学的课本中指明1非合数也非质数的说法,也听说过素数另一个定义:大于1的自然数中只能被1和它自己本身整除的数叫素数。
之所以会加上一个限定:大于1的自然数。我听说是因为数学家后来为了证明某些定理的成立,把这个限定加上去的。具体的来龙去脉,我非专业人士,不得而知。但我在网上GOOGLE到一篇文章:http://www.teach8.net/runwen/gzjyrw/gzsxrw/200608/4334.html
说明了一些情况,可做参考,大家自行判断。
回来译文来说一下。
原文64和65行如下:
- 64 let i=$LOWER_LIMIT+1
- 65 # We know 1 is prime, so let's start with 2.
复制代码
译文如下:
- 64 let i=$LOWER_LIMIT+1
- 65 # 我们都知道1是素数, 所以我们从2开始.
复制代码
1是否是素数,这个我已无法下定论了,因为可能数学界也是没个定论。从本文的原作者的意思上来看,1是素数。从2开始过滤素数是作者的原意。如此联系推看,这种译法还是比较合理的,也没有误导的问题存在。并且原作者的算法也是对的。
还有SPLIT的这个变量没有用过,应该再用在第70行,把那个$UPPER_LIMIT,改成$SPLIT
原文中提到这个变量时说明如下:
- 17 let SPLIT=UPPER_LIMIT/2
- 18 # Optimization:
- 19 # Need to test numbers only halfway to upper limit (why?).
复制代码
译文如下:
- 17 let SPLIT=UPPER_LIMIT/2
- 18 # 优化:
- 19 # 只需要测试中间到最大之间的值 (为什么?).
复制代码
原作中有效的代码中此变量的确没有用过,如上的这句,我推测作者的用意是让读者思考为何只用检测一半的值就可以了?并没有使用此变量的含义。
而你上面所做的修改应是恰好做了此种优化(上面你提的改过的方法应和后面那个算法版本(107行之后的算法)是一样的)。到了目前的4.0最新的ABS版本,这个例子还是如此安排。我认为原文和译文也是没有错的。
如果还有不妥之处,也请兄弟继续指正。多谢。 |
|