python矩阵幂函数 python矩阵方程

Fibonacci数列高效解法大全及时间复杂度分析 连载【5】

……续上回 Fibonacci数列高效解法大全及时间复杂度分析 连载【4】

为澧县等地区用户提供了全套网页设计制作服务,及澧县网站建设行业解决方案。主营业务为网站建设、网站设计、澧县网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

来看profile的记录分析,看时间具体用在哪个部分了

一看,绝大部分时间耗在两句results上了

看来主要都用来大整数运算了

下面来试一下

把这程序里两句“results = ”后面的大数运算注释掉,换成1。也就是两句都成“results = 1”

再运行计时看看

Total time: 0.000753秒

很惊人,去掉大数运算后,运行时间缩短成了原用时的1%。也就是99%时间消耗在Python内置的大数运算上了

下面试下用号称地球上最好的大数运算库替换掉Python内置的大数运算

9.  应用GMP库

全称是GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库,这是一个C写成的高效大数运算库

gmpy2是Python下对GMP库的封装

安装很简单,在操作系统下打命令pip install gmpy2,就安装好了

应用到程序也很简单

把上面的二分迭代解法程序开头添加一行

再把程序里

改成

就可以了

运行看一下用时

Total time: 0.00689297秒

是原用Python内置大数运算用时的9%

效果显著。可见Python内置大数运算效率确实不怎么样

相关大整数乘法高效算法的介绍可参见这篇《 【算法】大数乘法问题及其高效算法 》

极大整数乘法的时间复杂度低至近似O(n*log n)

前面二分解法本身时间复杂度是O(log n)

现在把大数因素考虑进去。大数时间复杂度的n可以用二进制位数表示

第n项斐波那契数的二进制位数k跟n是线性关系,n*10,那位数k也是*10

现在把极大整数乘法时间复杂度代入,O(n*log n)*O(log n)=O(n*(log n)^2)

也就是在大数情况下二分解法的时间复杂度为O(n*(log n)^2)

可以看这篇《 为什么算法渐进复杂度中对数的底数总为2 》解释

10.  矩阵解法

斐波那契数列和矩阵的关系推导我看到GoCalf Blog里写的一段非常清晰,特在此引用

这解法就是求矩阵的n-1次幂。矩阵幂运算也能根据下面公式迭代二分加速

就是所谓的矩阵快速幂

Python里库很丰富,大名鼎鼎的numpy就是一个有关矩阵的库。这库是有优化的,算矩阵幂就不用个人再写什么矩阵快速幂函数了

用numpy库就能很简单的写出来

因为numpy没有大数支持,大数运算还是要用GMP库

同上测用时

Total time: 0.042466秒

这幂运算是二分加速的,时间复杂度为O(log n)

对于固定阶矩阵相乘,乘的次数是个常数,也就是O(1)。虽然这个常数比较大^_*

代入大数时间复杂度,总体复杂度也是O(n*(log n)^2)

这儿来解释下为何矩阵快速幂比二分递归解法时间常数大

我们再来仔细看看斐波那契数列的矩阵形式:

会发现 z 和 y 必然相等,z 没必要再计算一遍。

t = x - y,因此 t 也没必要再计算一遍。

只需要计算矩阵第一列的那两个元素即可:

矩阵快速幂中两个矩阵相乘实际可分解为8次两个大整数乘法,而二分递归中只需要3次两个大整数乘法。所以二分递归时间常数小。

未完待续……

Fibonacci数列高效解法大全及时间复杂度分析 连载【6】

3的x次方用Python怎么写

Python中幂运算可以使用**表示,Python中三次方可以表示为x**3,即为x的3次方。

**是Python中算术运算符表示幂运算,Python中算术运算符还有加、减、乘、除、取模、取整除。

Python自定义函数在运行时,最初只是存在内存中,只有调用时才会触发运行。

python中pow的用法

在python中就有内置函数pow函数表示幂的运算。

1、pow()函数Python的内置函数,它计算并返回x的y次方的值。

2、语法pow(x,y,z)

3、参数x--数值表达式。y--数值表达式。z--数值表达式。

4、返回值返回xy(x的y次方)的值。

5、pow()函数解释pow(x,y):表示x的y次幂。

python的几个简单问题关于幂运算和阶乘

前两个都封装成了函数。最后一个直接运行的。没有定义函数。

中间那个问题,是因为你忘记做类型转换,你试着运行这个number=int(number)。应该 就对了。

python3怎么取幂

python中,想要表示a的b次方时,有两种方法:

1,math.pow()这个内置函数

2,**运算符

这两种方法效果是一样的,但是当

b为分数,a为负数:当幂运算符的底数为负数、幂为分数时,Python会抛出ValueError: negative number cannot be raised to a fractional power异常,

这时有两种方法可以解决此问题:

1,底数a正负均可不影响你的算法的话,加一个绝对值就行了即abs(a);

2,如果底数a必须是正、或必须是负的话,需要采用复数进行运算。因此凡是遇到幂为分数的项,都将底数用complex()转换为复数。

推荐学习《python教程》。

想知道Python标准库math中用来求幂运算的函数是?

Python标准库math中用来求幂运算的函数是pow(x,y)

pow(x,y)函数和x**y是等效的,都是计算x的y次方

用法:

import math

print(math.pow(4,2))


网站标题:python矩阵幂函数 python矩阵方程
文章URL:http://pwwzsj.com/article/dosdhoj.html