收藏 分享(赏)

数论(上).pptx

上传人:天天快乐 文档编号:568662 上传时间:2018-04-11 格式:PPTX 页数:29 大小:259.31KB
下载 相关 举报
数论(上).pptx_第1页
第1页 / 共29页
数论(上).pptx_第2页
第2页 / 共29页
数论(上).pptx_第3页
第3页 / 共29页
数论(上).pptx_第4页
第4页 / 共29页
数论(上).pptx_第5页
第5页 / 共29页
点击查看更多>>
资源描述

1、简单数论(数论上),素数求解是在ACM竞赛中很常用到的基本算法。那么大家平时是怎么求解素数的?10以内:2、3、5、7100以内:大家平时怎么求?10000又怎么求?1000000呢?下面给大家介绍!,第一节 素数,用每一个数x依次除以2 2 ;然后进行判断X是否为素数;代码如下:bool prime(int n) for(int i=2;isqrt(n);i+) if(n%i=0) return false; return true;,几种素数的求解方法,第一种(大家平时最常用的):,/用素数表判定素数,先调用initprimeint plist10000,pcount=0;int prim

2、e(int n)int i;if (n!=2,几种素数的求解方法,第二种求法:,void initprime()int i;for (plistpcount+=2,i=3;i50000;i+)if (prime(i)plistpcount+=i;,几种素数的求解方法,基本原理: 筛素数的基本方法是用来筛选出一定范围内的素数素数筛法的基本原理,利用的是素数p只有1和p这两个约数,并且一个数的约数一定不大于本身,素数筛法的过程:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。 求解用途: 素

3、数筛法经常作为一道题的一部分用来打一定范围内素数表,然后利用素数表作为基础解题。,几种素数的求解方法,第三种求素数的方法(筛选法)【重点须掌握】:,bool isprimeN;/N表示范围int primeN,cnt; void Prime() int i,j; cnt=0; memset(isprime,true,sizeof(isprime); isprime1=false; for(i=2;i=N;i+) if(isprimei) primecnt+=i;/记录素数 for(j=i*i;j=N;j+=i)/因为小于i的所有的倍数都被筛过,所以直接从i*i开始,从这里也可以看出,筛素数时到

4、N0.5就可以了 isprimej=false; ,费尔马小定理:如果p是一个素数,且0ap,则a(p-1)%p=1. 利用费尔马小定理,对于给定的整数n,可以设计素数判定算法,通过计算d=a(n-1)%n来判断n的素性,当d!=1时,n肯定不是素数,当d=1时,n很可能是素数. 二次探测定理:如果p是一个素数,且0x= 1; return ret; ,int witness(ll a, ll n) ll m = n - 1; int j = 0; while(!(m ,int miller_rabin(ll n) int i; if(n = 1) return 0; if(n = 2) re

5、turn 1; if(n % 2 = 0) return 0; for(i = 1; i =b,c=gcd(a,b),a=kc,b=jc,则k,j互素(否则c不是a,b的最大公约数),则设r=a%b则a=mb+r,则r=a-mb=kc-mjc=(k-mj)c,因为k,j互素,则k-mj与j互素gcd(a,b)=gcd(b,a%b) 基本用途:1、求两个数是否互质(求出最大公约数为1即可) 2、求最小公倍数,第二节 最大公约数(欧几里得算法),int gcd(int a,int b) if(b=0) return a; return gcd(b,a%b); ,欧几里得算法实现(递归),例题定义A

6、n为1,2,n的最小公倍数,例如,A1=1,A2=2,A3=6,A4=12,A5=60,A6=60。请你判断对于给出的任意整数n,An是否等于An1。如果An等于An-1则输出YES否则输出NO。,分析 由最小公倍数的定义我们可以知道,如果An=An-1则An-1可以被n整除,首先,对于一个数n如果是素数,那么An不等于An-1,其次,我们分析n,如果对于小于n的每一对因子即n=a*b(a1,则lcm(a,b)=n/gcd(a,b)n(lcm表示最小公倍数),那么很显然,如果n的每一对因子都是不互素的,则n不能整除An-1,否则可以整除An-1,因为n的因子肯定小于等于n-1,所以其每一对因子

7、的最小公倍数肯定可以整除An-1,所以这道题就0变成了判断n是否有互素的一对因子,所以我们只要枚举n的每一对因子,然后计算其最大公约数是否为1,如果有一对互素的因子则输出YES,否则输出NO,#include #include #include int gcd(int a,int b)/求最大公约数部分 if(b=0) return a; return gcd(b,a%b); int main() int n; int t; int i,j; scanf(%d, if(i=temp+1)/是素数直接输出NO ,printf(NOn); continue; for(i=2;i=temp;i+)/

8、枚举n的每一对因子是否互素 if(n%i=0) int q=n/i; if(gcd(q,i)=1) p=false; break; if(p) printf(NOn); else printf(YESn); return 0; ,当你想求ax+by=c是否有合适的x,y对于给定的a,b,c使得式子成立时,你该如何做?遍历x 、y?显然对于大数字不合适;这就是扩展的欧几里得算法主要解决的.欧几里得算法基本原理:设a和b不全为0,则存在整数x,y使得gcd(a,b)=xa+yb 对于辗转相除法的最后一项此时b=0,则gcd(a,b)=1*a+0*b,因为gcd(a,b)=gcd(b,a%b)则有x

9、*a+y*b=x1*b+y1*(a%b),扩展的欧几里得算法,将等式右边变形,b*x1+(a%b)*y1=b*x1+(a-(a/b)*b)*y1=a*y1+b*(x1-(a/b)*y1) 则,x=y1,y=x1-(a/b)*y1则可由后向前迭代得到x,y 基本用途: 对于扩展欧几里德定理的题,一般都需要进行一定的推导之后得到一个形式为xa+yb=c的方程,然后根据c确定解是否存在,如果c可以被gcd(a,b)整除,那么方程有解,否则方程无解。而且所得的解释不唯一的,对于一组解x0,y0则其所有解可以表示为x=x0+b/gcd(a,b)*t,y-y0-a/gcd(a,b)*t,t=0,+1,+2

10、一般会要求找出x或者y的最小正整数解,这个时候需要做一些调整。,int exgcd(int a,int b,int 下面给大家一个例题。,题目描述 :一个人有一种天平,这种天平只有两种重量的砝码a和b,现在要称出重量为c的物品,问你至少需要多少a和b,答案需要满足a的数量加上b的数量和最小,并且他们的重量和也要最小。(两个盘都可以放砝码) 输入样例: 1 0 1输出样例: 1 0,例题:POJ-2142The Balance,#include #define inf 0x7fffffff int Abs(int a) return ab?a:b; int exgcd(int a,int b,i

11、nt ,int d=exgcd(b,a%b,x,y); int t=x; x=y; y=t-(a/b)*y; return d; int main() int a,b,c,x,y,d,x1,y1,ansx,ansy,i; bool sf; while(scanf(%d%d%d, ,d=exgcd(a,b,x,y); x*=(c/d); y*=(c/d); int t=y*d/a; ansx=Abs(x+t*b/d); ansy=Abs(y-t*a/d); for(i=1;i5;i+) x1=x+(t+i)*b/d;/分别在t的附近找四个值 y1=y-(t+i)*a/d; x1=Abs(x1);

12、 y1=Abs(y1);,if(x1+y11为止;若p=n,则n为素数,否则p为n的一个约数并递归分解p和n/p。,对比较大的整数试除法等失去实用价值这时采用pollard rho整数分解法pr内存的是分解出的质因数初始化 ct为0 #define C 201/防止死循环typedef long long ll; ll pr100000; int ct; ll gcd(ll x, ll y) if(!x|!y) return x y ? x : y; for(ll t; t = x % y; x = y, y = t); return y; ll random(ll n) return (ll

13、)(double)rand() / RAND_MAX * n + 0.5); ,ll multi(ll a, ll b, ll n) /注意范围超整型 ll ret = 0; a %= n; while(b) if(b ,ll pollard_rho(ll n, int c) ll x, y, d, i = 1, k = 2; x = random(n - 1) + 1; y = x; while(1) +i; x = (multi(x, x, n) + c) % n; d = gcd(y - x + n, n); if(d 1 ,void find(ll n, int k) /深搜找出因子 if(n = 1) return; if(miller_rabin(n) prct+ = n; return; ll p = n; while(p = n) p=pollard_rho(p,k-1); find(p, k); find(n / p, k); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报