如何提高算法收敛速度(快速幂算法详解)
如何提高算法收敛速度(快速幂算法详解)
2024-11-22 04:42:19  作者:情在深处  网址:https://m.xinb2b.cn/sport/uph368647.html
前言

快速幂是什么?

顾名思义,快速幂就是快速算底数的n次幂。

有多快?

其时间复杂度为 O(log₂n), 与朴素的O(n)相比效率有了极大的提高。

用的多么?

快速幂属于数论的范畴,本是ACM经典算法,但现在各厂对算法的要求越来越高,并且快速幂适用场景也比较低多并且相比朴素方法有了非常大的提高。所以掌握快速幂算法已经是一名更合格的工程师必备要求!

下面来详细看看快速幂算法吧!

快速幂介绍

先看个问题再说:

初探

首先问你一个问题,如果让你求 (2^10)00你可能会这样写:

intva=1;for(inti=0;i<10;i ){va*=2;}System.out.println(va000);

熟悉的1024没问题,总共计算了10次。但是如果让你算 (2^50)000呢?

你可能会窃喜,小样,这就想难住我?我知道int只有32位,50位超出范围会带来数值越界的异常,我这次可以用long,long有64位呢!

longva=1;for(inti=0;i<50;i ){va*=2;}System.out.println(va);System.out.println(va000);

计算50次出了结果正当你暗暗私喜的时候又来了一个要命的问题:让你算 (2^1e10)000 且不许你用Java大数类,你为此苦恼不知所措。这时bigsai小哥哥让你百度下取模运算,然后你恍然大悟,在纸上写了几个公式:

(a b)%p=(a%p b%p)%p(1)(a-b)%p=(a%p-b%p)%p(2)(a*b)%p=(a%p*b%p)%p(3)a^b%p=((a%p)^b)%p(4)

你还算聪明一眼发现其中的规律:

(a*b)%p=(a%p*b%p)%p(3)(2*2*2···*2)10=[2*(2*2···*2)]5=(25)*(2*2···*2%le5)5

凭借这个递推你明白:每次相乘都取模。机智的你pia pia写下以下代码,却发现另一个问题:怎么跑不出来?


咱们打工人需要对计算机运行速度和数值有一个大致的概念。循环体中不同操作占用时间不同,所以当你的程序循环次数到达1e6或1e7的时候就需要非常非常小心了。如果循环体逻辑或者运算较多可能非常非常慢。


快速幂探索

机智的你不甘失败,开始研究其数的规律,将这个公式写在手上、膀子上、小纸条上。吃饭睡觉都在看:


然后你突然发现其中的奥秘,n次幂可以拆分成一个平方计算后就剩余n/2的次幂了:


现在你已经明白了快速幂是怎么回事,但你可能有点上头,还是给我讲了很多内容:


快速幂实现

至于快速幂已经懂了,我们该怎么实现这个算法呢?


说的不错,确实有递归和非递归的实现方式,但是递归使用的更多一些。在实现的时候,注意一下奇偶性、停止条件就可以了,奇数问题可以转换为偶数问题:

2*2*2*2*2=2*(2*2*2*2)奇数问题可以转化为偶数问题。

这里,递归的解法如下

longc=10000007;publiclongdivide(longa,longb){if(b==0)return1;elseif(b%2==0)//偶数情况returndivide((a%c)*(a%c),b/2)%c;else//奇数情况returna%c*divide((a%c)*(a%c),(b-1)/2)%c;}

非递归实现也不难,控制好循环条件即可:

//求a^b00000007longc=1000000007;publiclongdivide(longa,longb){a%=c;longres=1;for(;b!=0;b/=2){if(b%2==1)res=(res*a)%c;a=(a*a)%c;}returnres;}

对于非递归你可能有点模糊为啥偶数情况不给res赋值。这里有两点:

为奇数的情况res仅仅是收集相乘那个时候落单的a最终b均会降到1,a最终都会和res相乘,不用担心会漏掉理想状态一直是偶数情况,那最后直接获得a取模的值即可。

如果还是不懂,可以用这个图来解释一下:


矩阵快速幂

你以为这就结束了?虽然快速幂主要内容就是以上内容,但是总有很多牛人能够发现很有趣的规律—矩阵快速幂。如果你没听过的话建议仔细看看了解一下。

大家都知道斐波那契数列: 的规则:


前几个斐波那契的数列为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

斐波那契从递推式就可以看出是指数级别的增长,所以稍微多几个数字就是爆炸式增长,所以很多时候也会要求最后几位的结果。有了前面模运算公式溢出就不成问题,但n如果非常非常大怎么快速计算就成了一个新的问题。

我们看下面一组公式:

f(n 1)=f(n) f(n-1)f(n)=f(n)

如果那f(n)和f(n-1)放到一个矩阵中(一行两列):[f(n 1),f(n)] 能否找到和[f(n),f(n-1)]之间的什么规律呢?

答案是存在规律的,看上面的公式知道

[f(n 1),f(n)]=[f(n) f(n-1),f(n)][11]=[f(n),f(n-1)]*[10][11][11]=[f(n-1),f(n-2)]**[10][11]=·······

所以现在你可以知道它的规律了吧,这样一直迭代到f(2),f(1)刚好都为1,所以这个斐波那契的计算为:


而这个矩阵有很多次幂,就可以使用快速幂啦,原理一致,你只需要写一个矩阵乘法就可以啦,下面提供一个矩阵快速幂求斐波那契第n项的后三位数的模板,可以拿这个去试一试poj3070的题目啦。

publicintFibonacci(intn){n--;//矩阵为两项inta[][]={{1,1},{1,0}};//进行快速幂的矩阵intb[][]={{1,0},{0,1}};//存储漏单奇数、结果的矩阵,初始为单位矩阵inttime=0;while(n>0){if(n%2==1){b=matrixMultiplication(a,b);}a=matrixMultiplication(a,a);n/=2;}returnb[0][0];}publicint[][]matrixMultiplication(inta[][],intb[][]){//intx=a.length;//a[0].length=b.length为满足条件inty=b[0].length;//确定每一排有几个intc[][]=newint[x][y];for(inti=0;i<x;i )for(intj=0;j<y;j ){//需要确定每一个元素//c[i][j];for(intt=0;t<b.length;t ){c[i][j] =(a[i][t]000)*(b[t][j]000);c[i][j]%=10000;}}returnc;}

结语

这篇到这里就肝完啦,其实快速幂的内容还不止这么多,尤其是矩阵快速幂,会有着各种巧妙的变形,不过跟数学有一些关系,这年头,不会点算法、不会点数学真的是举步维艰。所以大家要对本篇内容好好吸收,让我那么久的努力发挥出作用。

如果有疑问不懂得欢迎私聊我讨论。也希望大家点个在看,您的支持是我努力的不断动力。

关注回复bigsai领取干货资源。下次再见,打工人!



  • 当归的正确种植方法(当归种植技术及管理)
  • 2024-11-22当归种植技术及管理当归,别名干归,秦哪,西当归,岷当归,金当归,当归身,涵归尾,当归曲、土当归,多年生草本,高0.4-1米6月至7月开花,7月至9月结实中国于1957年从欧洲引进了欧当归,主要生产于甘肃省东南部以岷县产。
  • 赵露思赵丽颖肖战(将门毒后拟开拍)
  • 2024-11-22将门毒后拟开拍《重生之将门毒后》这部由千山茶客撰写的网络小说非常惊艳,被无数网友追捧目前网上已经爆出该部小说将拍成电视剧,并且已经进入前期筹备阶段的新闻只是,目前主角尚未确定面对如此佳作,很多网友纷纷对小说中主角沈。
  • 相差十岁叫什么(相差十岁叫法)
  • 2024-11-22相差十岁叫法10岁以内,只能算姐妹(兄弟,兄妹,姐弟)之交等,要是情侣的话,就算是男女之交因为相差10岁虽然年龄差距上和同龄人相比稍大一些,但因为你们又是一代人所以不算忘年之交老牛吃嫩草是指男人和女人年龄相差悬殊。
  • 明星谈相声界辈分集锦(相声圈的师徒制)
  • 2024-11-22相声圈的师徒制现在,相声圈的师徒制,主要作用似乎就是为了制造“洒狗血”01相声圈实行师徒制的另一个重要原因是福利保障、保险的需要相声产生于清末民初当时可没有国家福利保障制度;也不可能有那时的国家,既没有这种财力,也。
  • 八方来财叶子都耷拉下来了怎么办(家庭常见的八方来财)
  • 2024-11-22家庭常见的八方来财文/小精致生活它俗名“八方来财”,适合居室养护,注意4点,枝繁叶茂绿又旺家庭养绿植,以美化居室、净化空气、招财纳福为主要目的,所以要求摆放在室内的花草最好四季常青、养护简单、株型优美、名字吉祥鸭掌木就。
  • 约定的梦幻岛全季大结局 约定的梦幻最全剧情梳理
  • 2024-11-22约定的梦幻岛全季大结局 约定的梦幻最全剧情梳理《约定的梦幻岛》是导览书《这本漫画真厉害》中的2018年第一名获奖作这部作品在《JUMP》中异军突起,它取得成功的关键是缜密的细节与具有“爆发性”的反转,让人看了第一话就要一口气看到最后剧情的脱颖之处。
  • 吴宗宪回应罗志祥复出(吴宗宪挺罗志祥)
  • 2024-11-22吴宗宪挺罗志祥罗志祥事情最近闹的沸沸扬扬,在大陆和台湾引起了热议,截然不同的是两边的态度,日前吴宗宪在节目里谈罗志祥周扬青分手一事:“如果是喜欢他舞台上的表演,应该要给他机会”大陆网友不禁网友:对男的那么宽容,那李。
  • 35岁女人下巴反复长痘(鼻子上长痘痘是什么原因)
  • 2024-11-22鼻子上长痘痘是什么原因鼻子长痘的原因有哪些?一:遗传性油性皮肤:遗传性油性皮肤,油脂分泌旺盛,过多的油脂导致毛孔堵塞,继而引发痘痘、粉刺建议多喝清水,补充维生素B6、B2,有效改善鼻子油脂分泌过剩现象,缓解和治疗鼻子上的痘。
  • 放假无聊来看看这几部电影吧(放假最奢侈的事)
  • 2024-11-22放假最奢侈的事有些事,得有情调比如喝茶,刘姥姥是解渴,咕噜咕噜一顿猛灌;汪曾祺就是生活,把茶浸透在时光里比如看电影,钢铁侠跟霍比特人可以随时看,哪怕是期末考期间,都能在吃饭时撸一部但侯孝贤的电影,就不行最好是假期看。
  • 花换盆后注意事项(要给花换盆6个错误)
  • 2024-11-22要给花换盆6个错误我们在家庭中养花经常要给花换盆,但是换盆的时候一定要正确操作,如果换盆不当,还不如不去给它换盆,换完盆以后大部分花都是会出问题的所以今天要给大家介绍一下养花换盆的6个“错误”,您一定要知道,一定要合理。
  • 主持人王芳和老公的现状(主持王芳晒花絮)
  • 2024-11-22主持王芳晒花絮近日,主持人王芳晒出了一段短视频视频中,她穿着一席红裙,搭配干练的短发,端庄中带着一份温柔搞笑的是,上台之前穿着拖鞋,将高跟鞋放在前面作为女人,她懂得穿高跟鞋的痛在没有正式开始录制之前,是不会穿高跟鞋。