- 浏览: 897045 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
通常会有如下问法:
有两个数,A和B,A的范围较小,B的范围较大。问A的B次幂的最后n位是多少? n一般都小于5.
或
有两个数,A和B,他们的范围都很大。问A的B次幂的最后n位是多少?
该题目主要思路是A的B次幂最后求余即可。但是A和B要不一个很大,要不都很大,是很难求到的。
都用到了数学里的同余数的概念。
同余数概念如下:
采用同余的习惯写法,对三个整数a,b,p, p>0
a=b (mod p) (其实等式应该是三横,我没有找到HTML的表示方法)
表示a%p=b%p. 同余有个很好的基本性质: 支持加法和乘法. 即:
若 a=b (mod p), c=d (mod p), 则有
a+c=b+d (mod p), a*c=b*d (mod p)
因此, 若a=b(mod p), 则对任意自然数n, 有
a^n=b^n (mod p)
上式可以帮助解决楼主的问题(求a^n除以p的余数): 若a是个很大的数,我们先求出它除以p的余数b,然后计算b^n除以p的余数就行了.
但是,如果n也很大, 计算b^n的工作量还是不小. 受启于同余式中的Euler定理, 我们可有如下作法:
考虑b,b^2,b^3,...b^n,...这些数除以p的余数得到的数列S,S(有无穷项)中每一项都是0到p-1之间的某一个数.因此,一定有不相等的两个数m,n使得
S[m]=S[n]
注意只要S[m]=S[n], 就一定有S[m+1]=S[n+1], S[m+2]=S[n+2], ... s[m+k]=S[n+k], ...
因此, 数列S实际上是循环的,并且循环的周期小于等于p, 因此用程序可很快算出其周期.
----------------------------------------------------------------------
取模的方法有一点a^(2^n)%c=(a^2%c)^(2^(n-1))%c
#include <iostream> using namespace std; long PowerMod(long a, long b, int k) { long tmp = a, ret = 1; while (b) { if (b & 1) ret = ret * tmp % k; tmp = tmp * tmp % k; b >>= 1; } return ret; } int main() { long a; long b; int i,N; cin>>N; for(i=0;i<N;i++) { cin>>a>>b; cout<<PowerMod(a,b,9907)<<endl; } return 0; }
求最后几位,如最后四位,只要模10000就行了。
要算一共有多少位,可以求log10(a^b)=blog10(a)(小数进位),例如5^10
有10*log10(5)=6.98,进位得7。
【解释】
zz: http://blog.csdn.net/shuqin1984/article/details/6543677
整数的二进制分解
将大整数 power 按照二进制进行分解:
power = b[N] * 2^N + b[N-1] * 2^(N-1) + … + b[1] * 2 + b[0]
其中: b[i] 取值为 0 或 1 ( i=0,1,.., N),则
a^power = a^(b[N] * 2^N) * a^(b[N-1] * 2^(N-1)) * … * a^(b[1] * 2) * a^b[0]
很显然:
(1) 若 b[i] = 0, 则 b[i] * 2^i = 0 , a^(b[i]*2^i) = 1, 该乘积项可以消去;
(2) 若 a[i] = 1, 则 b[i] * 2^i = 2^i , a^(2^i) % m = (a^(2^(i-1)) % m)^2 % m.
令 temp = a^(2^(i-1)) % m , 则 a^(2^i) % m = (temp * temp) % m。
比如, power = 26 = 16 + 8 + 2 = (11010)2, 则 a^26 = a^(2^4 + 2^3 + 2^1);
计算 a^power 实际上是计算 power 的二进制表示中所有位为1对应的乘积项。
(a^26) % m = ((a^16 %m) * (a^8 %m) * (a^2 % m)) %m
而, a^8 % m = ((a^4 %m) × (a^4%m)) % m 是可以用动态规划法逐次求解的。 简单起见, 将 (a^i) % m 称为 “取模乘积项”。
算法描述:
令 temp = a^(2^i) % m , i 是 power 的当前二进制位所对应的位置,
temp 表示 power 的当前二进制位所对应的(取模)乘积项
STEP1: 初始化 temp 为 a % m , result = 1;
STEP2: 对 power 进 行二进制分解。 若 power >=1 , 则进行模2运算:否则转至 STEP3
[1] 若余数为1, 则该位置上的二进制为1, 乘积中需要加入此时的 temp 项 : result = (result * temp) % m;
下一个二进制位对应的乘积项为 temp = (temp * temp) % m
[2] 若余数为0, 则该位置上的二进制为0,乘积中不需要加入 temp 项, result 保持不变,
下一个二进制位对应的乘积项为 temp = (temp * temp) % m
STEP3: 所有的二进制位对应的乘积项都已计算,算法结束。
比如, result = (3^26) % 5 的计算过程如下:26 = (11010)2 ; (1)初始化: temp = 3^1 % 5 = 3;, result = 1 ; (2) 检测 26 的最低位二进制为0, 则 不加入乘积项,result = 1, temp =(3^2) % 5 = (temp * temp) % 5 = 4 (3) 检测 26 的次低位二进制为1, 则 加入乘积项, result = (result * temp) % 3 = 4 , temp = (3^4) % 5 = (4*4) % 5 = 1; (4) 检测 26 的次低位二进制为0, 则 不加入乘积项, result = 4, temp = (3^8) % 5 = (1*1) % 5 = 1; (5) 检测 26 的次低位二进制为1, 则 加入乘积项, result = (result * temp) % 5 = 4, temp = (3^16) % 5 = 1; (6) 检测 26 的次低位二进制为1, 则 加入乘积项, result = (result * temp) % 5 = 4, temp = (3^32) % 5 = 1. 由于所有位都检测完毕, 故 3^26 % 5 = 4. 由上可知, 3^26 % 5 = ((3^16) % 5)) * ((3^8) % 5) * ((3^2) % 5) % 5. 其中 3^16 % 5, 3^8 % 5, 3^2 % 5 是通过动态规划法逐渐求得的。
发表评论
-
不使用/,%,+和*,如何判断一个数能否被3整除
2012-05-30 14:28 1750如果n的二进制末位为0,那么n和n>>1同时被 ... -
一些数学知识
2012-03-31 20:12 818zz:http://hi.baidu.com/imak ... -
从N个变量中找出一个错误变量的方法
2012-03-31 12:17 832假设有N包咖啡,里面有一包咖啡是掺和了沙子的,可以将咖啡放到水 ... -
【转】大数据量算法
2012-03-06 16:11 1222第一部分、十五道海量数据处理面试题 1. 给定a、b两个 ... -
链表的一些常见笔试面试问题总结及代码
2010-10-27 13:39 1066先什么也不说,假设链 ... -
Trie Tree
2010-10-26 11:34 1450给你100000个长 ... -
字典树(trie tree)
2010-10-26 11:19 1361今天AC了两题tri ... -
高度为n的平衡二叉树最少需要多少个节点
2010-10-24 13:42 9370递推关系 A(1)=1 A(2)=2 A ... -
如何判断两个单向链表是否有相交,并找出交点
2010-10-24 13:37 1678题比较简单,单向链表有交点意思就是交点后的节点都是 ... -
大数据排序或取重或去重相关问题解决方案
2010-10-21 16:13 2752Q:TC群里有人发消息说在10亿个数据中找出所有的重复数,内存 ... -
分配排序(桶排序..)
2010-10-21 13:39 1850分配排序的基本思想:排序过程无须比较关键字,而是通过&qu ... -
Rete(3)
2010-10-21 09:59 9564.6 连接节点(Join node) ... -
Rete(2)
2010-10-21 09:57 1132使用RETE算法的模块系统 ... -
Rete(1)
2010-10-21 09:53 1029一、 rete概述Rete算法是一种前向规则快速匹配算法,其匹 ... -
[转]海量数据处理面试题
2010-10-20 15:15 10021. 给定a、b两个文件,各存放50亿个url,每个url各占 ... -
用JDBC实现数据的分页
2010-10-20 11:23 1199数据分页主要用到了resultSet的absolute()方法 ... -
如何求N的阶乘所得的数字末尾含有多少个0
2010-10-19 13:13 2145原题是这样: 给定 ... -
数据库笔试题(经典SELECT语句用法)
2010-10-18 22:49 2086问题描述: 为管理岗位业务培训信息,建立3个表: S ... -
Java分页实现
2010-10-18 22:11 1478Java代码 public interf ... -
Linux下大文件的排序和去重复
2010-10-15 10:02 2093Linux下我们用 sort 与 uniq 的命令来实现去重复 ...
相关推荐
本算法是求一个信号的高阶谱。并采用直接法求高阶谱
时间序列分析—高阶统计量方法-张贤达,523页电子版,很好的参考资料
本书是国内外第一本全面论述时间序列分析和信号处理中的高阶统计量理论、方法及应用的专著。全书共分十三章,内容包括高阶统计量、非参数化高阶谱分析、因果和非因果非最小相位系统的辨识、自适应估计和滤波、信号...
时间序列分析——高阶统计量方法-张贤达.pdf,
利用matlab仿真,用直接法和间接法求信号的双谱 需要用matlab 6.0及以下的软件 在7.0中部分函数有所改变
与众所周知的Ostrogradsky不稳定性不同,我们发现的不稳定性本质上是非线性的,而且还因为反度量的偶次幂都给出了像鬼一样的高阶动力学类项。 但是,真空状态是稳定的。 最后,我们证明了在足够低的能量下,我们的...
利用面积法求高阶微分方程系数,此为matlab文件,如有疑问可私信本人。
高阶运营方法论2-内容运营.pdf
括高阶统计量、非参数化高阶谱分析、因果和非因果非最小相位系统的辨识、 自适应估计和滤波、信号重构、信号检测、谐波恢复、多元时间序列分析、时变 非高斯信号的时频分析、阵列处理、循环平稳时间序列分析以及其它...
方阶矩阵n次方幂的求解方法探讨,张靖芝,李薇薇,方阵高次幂在高等代数题解、矩阵稳定性讨论等方面有着广泛的应用,但它的求解一般都比较困难。虽然它的运算遵循矩阵乘法规律,但
用Python实现四阶龙格-库塔(Runge-Kutta)方法求解高阶微分方程 (需要资源可进主页自取)
mdict词库,牛津高阶英汉双解词典第八版 还有另外两个文件,分别为“牛津高阶8简体.mdd”和“牛津高阶8简体.css”,因为太大了,无法上传。.css格式的为排版,.mdd格式的包含发音库。需要的留下联系方式。 因为我自己...
N阶矩阵高次幂的求法及应用.doc
N阶矩阵高次幂的求法与应用.doc
贝塞尔函数零点求取的函数。可以算到1001阶,网络上那些互相复制来复制去的内容只能算到135阶没法满足我的需要后自己编写的。有高阶计算需求的自取。
计算信号的高阶累积量,带注释,包括高阶矩,亲测可用,代码是matlab的。
为了解决传统的磁共振成像数据分类方法正确率较低的问题,提出了一种基于独立成分分析的高阶功能连接网络,使用加权图的频繁子图挖掘和判别性特征选择进行分类研究的方法。该方法不需要依赖先验的脑图谱模板,充分考虑...
感兴趣的可以看看,利用matlab语言写的基于高阶累积量的MUSIC算法。
这是高阶谱估计pdf学习课件,仅供参考。有用的可以拿去。是dsp(数字信号处理的学习资料),是基于清华的教材。