从APL书中,我试图破译当'j'不为0时我如何在C中转换'r'的计算:
对于每组整数n,j和b,其中b> 0,存在 唯一的整数q和r这样的
n = bq + r, j ≤ r < j + b.
将数量r称为n模b的j残差,并表示为 b | j n。例如,3 | 0 9 = 0,3 | 1 9 = 3,并且3 | 0 10 = 1。 此外,如果n≥0,则b | 0 n是除以得到的余数 n由b和q组成商的组成部分。
什么代表'j',如何通过在区间内迭代来获得r而不进行解析?
然后,该段的其余部分说:
在经典治疗中,如Wright(1939),只有0残基 考虑。使用单原点索引(参见1.5节)说明了这一点 1残基的利益。
所以我猜C中的n mod b
例如b | j n
,其中j = 0,但我不明白为什么使用'j = 1'会有利于索引1-origin。这有什么用?
答案 0 :(得分:2)
符号,符号,符号。
艾弗森的A编程语言中使用的符号早于后来作为现代APL实现。
我是从http://www.jsoftware.com/papers/APL.htm
得到的因此,将3 | 0 9作为下标写入0将在今天的几乎所有APL中起作为3 | 9。
3 | 1 9,其中1作为下标而未实现,但可以作为定义的运算符求解。 (我使用了Dyalog 13.1)
∇ r←x(i mod)y
[1] r←i+x|y-i
∇
3 (0 mod) 9
0
3 (1 mod) 9
3
3 (0 mod) 10
1
⎕io←0
3 (0 mod) ⍳9
0 1 2 0 1 2 0 1 2
⎕io←1
3 (1 mod) ⍳9
1 2 3 1 2 3 1 2 3
答案 1 :(得分:1)
假设N很大(或为负)并且你有一个b 在C中,它是0原点,你希望索引在0 ... b-1(包括)中。 在APL中,默认情况下为1-origin,您希望索引在1 ... b中。 这可能是1指数的好处。您可以计算1原点
来自没有迭代的0-origin: if(idx == 0)idx = b;
答案 2 :(得分:1)
Q1:是的。
在b|j n
中,b标量扩展为匹配j n
。因此它与(b∣j),(b∣n).
相同 j 不是 | 的修饰符。换句话说,b∣j n
不是n的j残基,而是j的0残基,后跟n的0残基。
在GNU APL中(我也相信所有其他APL)你得到:
3∣0 9
0 0
3∣1 9
1 0
从0残基模b中,您可以通过将 j∣b
添加到0残基来获得j残基:
+/ 3∣0 9
0
+/ 3∣1 9
1