整数除法仅使用加法,乘法,减法和最大值

时间:2018-04-30 17:58:54

标签: algorithm math integer logic lambda-calculus

假设我们有一种编程语言ℤ,它具有以下语法:

ℤ := 0 | 1 | (+ ℤ ℤ) | (* ℤ ℤ) | (- ℤ ℤ) | (max ℤ ℤ)

为方便起见,我们可以使用以下语言定义新的绑定表单:

  1. (not x) = (- 1 x)
  2. (abs x) = (- (max 0 (+ x x)) x)
  3. (min x y) = (- 0 (max (- 0 x) (- 0 y)))
  4. (nil x) = (not (min 1 (abs x)))
  5. 这种语言足以表达分支和比较运算符:

    1. (if x y z) = (+ (* x y) (* (not x) z))
    2. (eq x y) = (nil (- x y))
    3. (ne x y) = (not (eq x y))
    4. (le x y) = (nil (max 0 (- x y)))
    5. (gt x y) = (not (le x y))
    6. (ge x y) = (le y x)
    7. (lt x y) = (not (ge x y))
    8. 现在,问题是我们是否可以定义整数除法是这种语言:

      1. (div x y) = ?
      2. (rem x y) = (- x (* y (div x y)))
      3. 我不认为定义(div x y)是可能的,因为ℤ没有循环。但是,我不知道如何证明这一点。请注意,如果可能,则(div x 0)的结果无关紧要。因此,要么定义(div x y),要么证明不可能这样做。

2 个答案:

答案 0 :(得分:5)

这是不可能的。

如果存在具有整数系数和阈值f : Z -> Z的多项式p,则调用函数t 最终多项式,对于每x > t我们有f(x) = p(x)。让d(x) = [x/2]为二等分。 d最终不是多项式的,因为d的差分序列具有无穷多个零(f(2y) = y = f(2y+1)对于所有y),而每个非常数多项式的差分序列具有有限性许多。它足以证明所有可实现的函数最终都是多项式的。

通过结构归纳进行证明。 01是多项式。直接表明最终多项式函数的和,乘积和差异最终是多项式:使用两个阈值的最大值以及在这些操作下闭合多项式集合的事实。剩下的就是max下的封闭。

f最终通过多项式p进行多项式,g最终通过多项式q进行多项式。如果p = q,则显然x |-> max(f(x), g(x))最终通过相同的多项式进行多项式。否则,请注意p - q有很多真正的根。将阈值设置为根的上限,我们观察到最大函数最终通过pq进行多项式,因为max的另一种情况从不在此触发。

答案 1 :(得分:0)

递归和分支的组合将为您提供循环。

(div x y) = (iff gte(x y) (+ 1 (div((- x y) y))) 0)

在更多功能方面,我们正在重复减法。如果x> = y,则向商中添加一个,从x中减去y,然后重复。否则,返回0。

if x >=y
    return 1 + div(x-y y)
else
    return 0