(2&*~) 15 7 3 1
以上是成语。最后是痕迹和最终结果。我知道这个短语是一个单子,我知道因为 ~ 它有一个左右参数。如果您运行“15 7 3 1(2&*) 15 7 3 1”,则会发生相同的输出。我还知道正确的表格是 2 的 1、3、7、15 的幂,其他条目是它们的基数乘以 2 的幂,但我就是不明白为什么。
在相关的说明中,这是来自 Rosetta Code 网站上的 ethopian 乘法的短语(实际上,这也是,我在试图弄清楚这一点时已经走了这么远)和 '(1>.<.@-:)^: a:' 是短语。
(1>.<.@-:)^:a: 27
27 13 6 3 1
但是 (1>.<.@-:)^: 27 返回一个盒子的版本,我希望它运行 27 次。
在三个相关问题中的最后一个(这些都与分解 Ethopian 乘法代码有关),完整代码如下:
double =: 2&*
halve =: %&2 NB. or the primitive -:
odd =: 2&|
ethiop =: +/@(odd@] # (double~ <@#)) (1>.<.@halve)^:a:
并且可以简单地替换为:
ethiop =: +/@(2&|@] # (2&*~ <@#)) (1>.<.@-:)^:a:
这很好用!成功地冲了上去,当我想到有一个在命令行上工作的一元替身时,我完全从悬崖上掉下来了:
+: 98
196
而且双精度运算符必须比带有附加常量的双精度运算符快,也许双精度运算符只是移位,所以我认为
ethiop =: +/@(2&|@] # (+:~ <@#)) (1>.<.@-:)^:a:
会工作......但它没有。
我尝试过大写字母、连词等,但没有任何效果,它总是说“域错误”。我开始认为代码依赖于二元调用的 monad 以一种我不明白的方式创建加倍表。
唯一的好处是 J 动词奇数与测试奇数无关。
任何人都可以向我解释这些事情,也许用英语解释程序是如何工作的?不是算法如何工作,而是如何实现算法。我记得当我在 1970 年玩 IBM 1130 APL 时。这是一个以 8k 字运行的 APL 解释器,不用说,它是有限的。例如,它有一个滚动但没有交易。解释器逐步进出内存,1130 支持代码覆盖,它将您的子例程分成组,当一个组调用另一个组时,它将从磁盘加载新组(是的,8k 中的伪交换)。因此,我使用各种方案编写了 deal 的版本,并且随机地,我们会找到一个可以逐步进入和退出而无需搜索的版本,而那个版本,无论写得多么糟糕,有多少行和多少解释器操作都会运行 10 次和其他任何东西一样快。我不知道自己在做什么,我会不断地添加 ravels 和无意义的作业,并跨行打破陈述或将它们组合起来,直到我得到一个无需查找即可运行的语句。(正在寻求的 52 交易 52 可能需要 45 秒)。
然后昨晚我计算了 J 中的第 150,000 个斐波那契数。它必须是 64 位版本,并且花了 1 小时 17 分钟。我用了精确的算术,这个数字有 31349 位,它从 1012838344936638038 开始......我意识到 1130 永远不可能计算出这个,这个数字不合适,因为你需要三个,而最大的一个有 32k 16 位字。我想学习可以做到这一点的语言,但是文档中缺少一些我没有得到的东西。
trace '(2&*) 15 7 3 1'
--------------- 4 Conj -------
2
&
*
2&*
--------------- 3 Adverb -----
2&*
~
2&*~
--------------- 8 Paren ------
(
2&*~
)
2&*~
--------------- 0 Monad ------
2&*~
15 7 3 1
491520 229376 98304 32768
1920 896 384 128
120 56 24 8
30 14 6 2
==============================
491520 229376 98304 32768
1920 896 384 128
120 56 24 8
30 14 6 2
斐波那契脚注:
]t150k=:6!:2 'a150k =: $ ":r150k=: {: (,+/@(_2&{.) )^:150000 (0x 1x)'
4631.62
0 60 60 #: t150k
1 17 11.6167
r150k
10128383449366380384728502706681008427227914006240871521944866167854579423510169
50198752571599303492471943589300904953648270811064370506598260395645679940891823
17307901573781852234222080308236027906733606532470814177610613237408102006595571
1949713927351702...
a150k
31349