基本数论算法

dalao博客,至少很好看。。

因为本人数论实在渣渣,但是考试确是得考的,只好尽早学,尽早掌握。

最大公因数

普通gcd

1 inline int gcd(int x,int y)
2 {
3     return y == 0 ? x : gcd(y, x % y)
4 }

二进制优化gcd

1 inline int bsgcd(int x, int y)
2 {
3     if(x == y) return x;
4     if(x < y) x ^= y ^= x ^= y;
5     if(!(x & 1)) //x偶 y偶 gcd(x,y)=2*gcd(x/2,y/2),x偶 y奇 gcd(x,y)=gcd(x/2,y)
6          return (!(y & 1)) ? 2 * bsgcd(x >> 1, y >> 1) : bsgcd(x >> 1, y);
7      //x奇 y偶 gcd(x, y)=gcd(x,y/2)
8     return (!(y & 1)) ? bsgcd(x, y >> 1) : bsgcd(y, x - y);
9 }

时间: 2024-10-06 00:54:04

基本数论算法的相关文章

数论算法模板总结

公约数 GCD LL GCD( LL a,LL b ) { return b==0?a:GCD(b,a%b); } EX_GCD LL EX_GCD( LL a,LL b,LL &x,LL &y )//ax+by=gcd(a,b) { LL d=a; if( !b ) x=1;y=0; else { d=EX_GCD(b,a%b,y,x); y-=a/b*x; } return d;//返回最大公因数 } /* 求a * x + b * y = c的整数解. 1.先计算Gcd(a,b),若

数论算法——信息安全数学基础算法总结(python版)

/* Author: wsnpyo Update Date: 2014-11-16 Algorithm: 快速幂/Fermat, Solovay_Stassen, Miller-Rabin素性检验/Exgcd非递归版/中国剩余定理 */ import random def QuickPower(a, n, p): # 快速幂算法 tmp = a ret = 1 while(n > 0): if (n&1): ret = (ret * tmp) % p tmp = (tmp * tmp) %

【数论算法基础理论与实现】

[题目太正式了我还怎么写ヾ|≧_≦|"] [很简要] [参考文献:<算法导论>.白书.天宇哥哥课件] 1.基础 [除法定理]:对于任何整数a和正整数n,存在唯一整数q和r,满足0<=r<n且a=qn+r   WARN:C++中貌似不完全遵守这个东西,n认为是|n|,并且a为负时r可以为负 []  2.最大公约数 几条性质:gcd(a,b)=gcd(|a|,|b|) gcd(a,0)=|a| gcd(a,ka)=|a|   gcd(a,b)=gcd(b,a mod b) -

数论算法模板(不定期更新)

/**********/ #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<cstdlib> #include<vector> #include<stack> #include<map> using name

常用数论算法

1.求两数的最大公约数 function gcd(a,b:integer):integer; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod b); end ; 2.求两数的最小公倍数 function lcm(a,b:integer):integer; begin if a<b then swap(a,b); lcm:=a; while lcm mod b>0 do inc(lcm,a); end; 或者利用 最小公倍数=a*b/最大公约数 3

离散数学——数论算法

最近在复习离散数学,这篇文章是<离散数学及其应用>第六版中第三章 算法.整数.和矩阵中涉及到的几个算法,我想了一下,光看看也起不到什么作用,于是自己动手写了一下,下面的代码都是我自己按照书上的伪代码写出来的,初步验证没什么问题,如果有什么问题就请告知我一下,谢谢! 一.十进制到任意进制数据转换 根据进制转换规则:十进制到n进制整数部分除n取余向上书写,小数部分乘n取整向下书写,实际上整数部分就是用的短除法,这个算法实际上就是贪心算法的一个实例,由于是向上书写,我们可以借助栈这种特殊的数据结构很

基础数论算法

最大公约数 1 int gcd(int a,int b) 2 { 3 int temp; 4 while(b) 5 { 6 temp = b; 7 b = a%b; 8 a = b; 9 } 10 11 return a; 12 } 最小公倍数 1 int lcm(int a,int b) 2 { 3 return a*b/gcd(a,b); 4 } 素数 判断n是否为素数 1 bool prime(int n) 2 { 3 for(int i=0; i<=sqrt(n); i++) 4 { 5

模板C++ 02数论算法 1最大公约数 AND 2素数判断

2.1最大公约数Greatest Common Divisor 补充知识:x*y=最小公倍数*最大公约数 int Euclid(int a,int b) { if(b==0) return a; return Euclid(b,a%b); } 2.2素数判断Prime #include<cmath> bool Prime(int n) { int t=sqrt(n); for(int i=2;i<=t;i++) if(n%i==0) return false; return true;

模板C++ 02数论算法 5快速幂及快速乘

2.5快速幂及快速乘 int qmul(int x,int y) { int s=0; while(y) { if(y&1) s=(s+x)%p; x=(x+x)%p; y>>1; } return s%p; } int qpow(int x,int y) { int s=1; while(y) { if(y&1) s=qmul(s,x); x=qmul(x,x); y>>1; } return s%p; }