5

两个数字的乘法可以在算法上定义如下:“将第一个数字添加到自身的次数等于第二个数字的值”。两个数字的幂运算可以在算法上定义如下:“将第一个数字乘以自身的次数等于第二个数字的值”。考虑乘法和求幂的这些定义会引发一些问题......

首先,能否以加法为基本运算来定义一类算术运算?我写了一些haskell代码来测试这个想法:

order1 x y = x + y
order2 x y = foldl (order1) x (replicate (y - 1) x)
order3 x y = foldl (order2) x (replicate (y - 1) x)
order4 x y = foldl (order3) x (replicate (y - 1) x)
order5 x y = foldl (order4) x (replicate (y - 1) x)

果然,'order2'的意思是乘法,'order3'的意思是求幂。据我所知,英语中缺少“orderN”的词,其中 N > 3。数学界对这些操作有什么有趣的说法吗?

此外,考虑到这些“顺序”函数的递归外观,如何编写这样的函数:

generalArithmetic :: Int -> Int -> Int -> Int
generalArithmetic n x y =   --Comment: what to put here?

这意味着当n等于2时乘法,当n等于3时意味着取幂......?

另外,如何推广这些算术函数,以便它们可以对所有实数进行运算?毕竟,“复制”的类型是 Int -> a -> [a]。

4

2 回答 2

4

是的。您可以从 peano 算术开始作为一阶(增量)

Brainf*ck只有递增、递减和检查非零值。即使这样,它也可以执行任何其他计算机程序可以执行的任何计算,只要它始终具有足够的内存并且您不急于得到答案。

这种性质称为图灵完备性,即使没有输入和Brainf*ck输出也是如此。因此,使用<, >, +, -, [,]您可以编写一个程序来解决其他编程语言可以解决的所有数学问题。

到目前为止,我已经用它制作了加法、减法、平均、乘法、除法、模数和平方根的程序。

于 2013-08-06T00:53:56.930 回答
2

如果有人关心我之前所说的“generalArithmetic”的定义,这里是:

arithmetic n x y = if n == 0
                   then (x + y)
                   else foldl (arithmetic (n - 1)) x (replicate (y - 1) x)
于 2013-08-06T02:09:32.170 回答