看到整个操作链作为一行代码(你可以直接用
bc
运行)确实有助于理解算法在每个阶段要做的事情:
计算插入符号(^)的个数,以得到总共的平方次数。
29 ^ 1847
| expn LSB bitstring := 11101100111
| 29*(29*(29*((29*(29*(((29*(29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 4373
| expn LSB bitstring := 1010100010001
| 29*((29*((29*((((29*((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 8563
| expn LSB bitstring := 11001110100001
| 29*(29*(((29*(29*(29*((29*(((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 8689
| expn LSB bitstring := 10001111100001
| 29*((((29*(29*(29*(29*(29*(((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 9067
| expn LSB bitstring := 11010110110001
| 29*(29*((29*((29*(29*((29*(29*((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 11197
| expn LSB bitstring := 10111101110101
| 29*((29*(29*(29*(29*((29*(29*(29*((29*((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 14813
| expn LSB bitstring := 10111011100111
| 29*((29*(29*(29*((29*(29*(29*(((29*(29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 15749
| expn LSB bitstring := 10100001101111
| 29*((29*(((((29*(29*((29*(29*(29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 16703
| expn LSB bitstring := 111111001000001
| 29*(29*(29*(29*(29*(29*(((29*((((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 18919
| expn LSB bitstring := 111001111001001
| 29*(29*(29*(((29*(29*(29*(29*(((29*(((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 24071
| expn LSB bitstring := 111000000111101
| 29*(29*(29*(((((((29*(29*(29*(29*((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 24371
| expn LSB bitstring := 110011001111101
| 29*(29*(((29*(29*(((29*(29*(29*(29*(29*((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 25933
| expn LSB bitstring := 101100101010011
| 29*((29*(29*(((29*((29*((29*(((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 26003
| expn LSB bitstring := 110010011010011
| 29*(29*(((29*(((29*(29*((29*(((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 27851
| expn LSB bitstring := 110100110011011
| 29*(29*((29*(((29*(29*(((29*(29*((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 28097
| expn LSB bitstring := 100000111011011
| 29*((((((29*(29*(29*((29*(29*((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 28537
| expn LSB bitstring := 100111101111011
| 29*(((29*(29*(29*(29*((29*(29*(29*(29*((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 28603
| expn LSB bitstring := 110111011111011
| 29*(29*((29*(29*(29*((29*(29*(29*(29*(29*((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 32869
| expn LSB bitstring := 1010011000000001
| 29*((29*(((29*(29*(((((((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 33013
| expn LSB bitstring := 1010111100000001
| 29*((29*((29*(29*(29*(29*((((((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 33107
| expn LSB bitstring := 1100101010000001
| 29*(29*(((29*((29*((29*(((((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 33529
| expn LSB bitstring := 1001111101000001
| 29*(((29*(29*(29*(29*(29*((29*((((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 33629
| expn LSB bitstring := 1011101011000001
| 29*((29*(29*(29*((29*((29*(29*((((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 33809
| expn LSB bitstring := 1000100000100001
| 29*((((29*((((((29*(((((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 36899
| expn LSB bitstring := 1100010000001001
| 29*(29*((((29*(((((((29*(((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 38651
| expn LSB bitstring := 1101111101101001
| 29*(29*((29*(29*(29*(29*(29*((29*(29*((29*(((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 38839
| expn LSB bitstring := 1110110111101001
| 29*(29*(29*((29*(29*((29*(29*(29*(29*((29*(((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 46093
| expn LSB bitstring := 1011000000101101
| 29*((29*(29*(((((((29*((29*(29*((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 47279
| expn LSB bitstring := 1111010100011101
| 29*(29*(29*(29*((29*((29*((((29*(29*(29*((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 47339
| expn LSB bitstring := 1101011100011101
| 29*(29*((29*((29*(29*(29*((((29*(29*(29*((29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 52183
| expn LSB bitstring := 1110101111010011
| 29*(29*(29*((29*((29*(29*(29*(29*((29*(((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 52697
| expn LSB bitstring := 1001101110110011
| 29*(((29*(29*((29*(29*(29*((29*(29*(((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 53569
| expn LSB bitstring := 1000001010001011
| 29*((((((29*((29*((((29*((29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 59471
| expn LSB bitstring := 1111001000010111
| 29*(29*(29*(29*(((29*(((((29*((29*(29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 63029
| expn LSB bitstring := 1010110001101111
| 29*((29*((29*(29*((((29*(29*((29*(29*(29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 63667
| expn LSB bitstring := 1100110100011111
| 29*(29*(((29*(29*((29*((((29*(29*(29*(29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
29 ^ 65287
| expn LSB bitstring := 1110000011111111
| 29*(29*(29*((((((29*(29*(29*(29*(29*(29*(29*(29)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
这段脚本代码可以自动生成。
gawk 'function ____(__, ___, _) {
if (_ == "") {
if ((__ *= (___ = length(__ = (_)__)) \
* _++ < (__ = int(__))) < ++_)
return __
_ ^= (___ += __ + __ < (_+_)^_^_ \
? _ * --___ \
: _ * ___ - _^(__ < (_*_^_^_)^_))
if (__ < _)
___ -= __ < (__ += __)
if (_+_ <= __)
while ((_+=_+!++___)+_ <= __);
return (_<__ ? ____(__ -= _, ___, _) \
: sprintf("%.*d", ___, !_) !!_
}
return !--___ ? !!+__ : (__+=__)<_ ? ____(__, ___, _) !_ \
: ____(__-=_,___,_) !!_
}
BEGIN {
OFS = ")^2"
} _ = NF {
printf("\f %11s^%-5s \f\r\t\t| expn LSB bitstring := %*s\f\r\t\t| ",
__ = $!!_, $!_ = $_, _ = !_, $_ = ____($_)) > ("/dev/stderr")
print ($!(NF = gsub(/[^01]+/, "")^_ * gsub(_, "(") + gsub(!_,
__ "*(") * sub(/[^0-9]*$/, "") \
* sub(/^$/, !_)^_))) "\n") > ("/dev/stderr") } NF'
========
如果你好奇的话,最小的奇质数的幂与能够由64位双精度类型表示的最大质数之间的关系可以通过以下一系列操作来表示:
3 ^ 9007199254740881
| expn LSB bitstring := 100010011111111111111111
11111111111111111111111111111
3*( ( ( (3*( ( (3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*
(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*
(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3*(3
\
)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2)^2
而且只需要一个1785 TB的驱动器,就可以存储4297万亿位的小数表示。