python学数学1-4:认识数字--自然数乘法与幂运算

我们继续建立自然数的乘法运算。乘法可以理解为加法的批量运算,所以在定义乘法时,我们将用到加法的定义。

根据我们熟悉的乘法规则,参考加法定义的模式,这样定义乘法的规则:

  • ①任何数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

猜你喜欢

转载自blog.csdn.net/xiaorang/article/details/105425605
今日推荐