我们继续建立自然数的乘法运算。乘法可以理解为加法的批量运算,所以在定义乘法时,我们将用到加法的定义。
根据我们熟悉的乘法规则,参考加法定义的模式,这样定义乘法的规则:
- ①任何数N乘以0都为0(N*0 => 0)
- ②如果有了N*M的结果,我们定义N* next(M)的结果为(N*M)+N(N* next(M) => (N*M) + N)
python的代码来实现如下(自然数乘法nMul)。
def nMul(a1, a2):
if isZero(a2):
return zero()
return nAdd(nMul(a1, nPre(a2)), a1)
与规则中描述的逻辑是自然数的后继与自身的关系,实现上略有差异的是,我们用的自然数与其前驱数的关系。
进而,我们在乘法的基础上定义幂运算。幂运算又可以理解为乘法的批量运算。
指数运算一个悬而未决的问题是0的0次方是多少,为了简化起见,我们之间约定0的0次方也是1。
规则是:
- ①(包括0在内的)任何数的0次幂都为0的后继数(N^0 => 1)
- ②如果有了N^M的结果,我们定义N ^ next(M)的结果为N ^ next(M) => (N ^ M) * N)
python的代码来实现如下(自然数乘法nPow)。
def nPow(a1, a2):
if isZero(a2):
return next(zero())
return nMul(nPow(a1, nPre(a2)), a1)
利用这次以及前两次的成果,我们可以做更多的测试。
def test_mul():
z = zero()
one = nNext(z)
two = nNext(one)
three = nNext(two)
four = nNext(three)
five = nNext(four)
# 测试一般乘法
assert isZero(nMul(z, four))
assert nEq(nMul(three, three), nGetNum('■■■■■■■■■'))
# 测试乘法加法混合运算
assert nEq(nMul(two, five), nAdd(nGetNum('■■■■■■'), nMul(one, four)))
# 测试乘法交换律
assert nEq(nMul(four, five), nMul(five, four))
# 测试乘法结合律
assert nEq(nMul(three, nMul(four, five)), nMul(nMul(three, four), five))
# 测试乘法对加法的分配律
assert nEq(nMul(three, nAdd(four, five)), nAdd(nMul(three, four), nMul(three, five)))
# 0次幂
assert nEq(nPow(z, z), one)
assert nEq(nPow(five, z), one)
# 1次幂
assert nEq(nPow(four, one), four)
# 较大的数字
assert nEq(nPow(four, two), nGetNum('■■■■■■■■■■■■■■■■'))
参与讨论及获取完整代码,可加Q群:102494165