数论:质数与约数
时间:2019-11-07
本文章向大家介绍数论:质数与约数,主要包括数论:质数与约数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
摘自《算法竞赛进阶指南》。
数论
1.质数
质数的判定
试除法
bool is_prime(int n){
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)return false;
return true;
}
质数的筛选
(1).Eratosthenes筛法
void primes(int n){
memset(v,0,sizeof(v));//合数标记
for(int i=2;i<=n;i++){
if(v[i])continue;
cout<<i<<endl;//i是质数
for(int j=i;j<=n/i;j++)
v[i*j]=1;
}
}
(2).线性筛法
int v[N],prime[N];
void primes(int n){
memset(v,0,sizeof(v));//最小质因子
m=0;//质数数量
for(int i=2;i<=n;i++){
if(v[i]==0){//i是质数
v[i]=i;
prime[++m]=i;
}
//给当前的数i乘上一个质因子
for(int j=1;j<=m;j++){
//i有比prime[j]更小的质因子,或者超出n的范围
if(prime[j]>v[i]||prime[j]>n/i)
break;
//prime[j]是合数i*prime[j]的最小质因子
v[i*prime[j]]=prime[j];
}
}
for(int i=1;i<=m;i++)
cout<<prime[i]<<endl;
}
质因数分解
(1).算数基本定理:任何一个大于1的正整数都能唯一分解为有限个质数的乘积
(2).试除法
void divide(int n){
m=0;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0){//i是质数
p[++m]=i,c[m]=0;
while(n%i==0)n/=i,c[m]++;//除掉所有的i
}
}
if(n>1)//n是质数
p[++m]=n,c[m]=1;
for(int i=1;i<=m;i++)
cout<<p[i]<<'^'<<c[i]<<endl;
}
2.约数
求N的正约数集合:试除法
int factor[1600],m=0;
for(int i=1;i*i<=n;i++){
if(n%i==0){
factor[++m]=i;
if(i!=n/i)
factor[++m]=n/i;
}
}
for(int i=1;i<=m;i++)
cout<<factor[i]<<endl;
求1~N每个数的正约数集合:倍数法
vector<int>factor[500010];
for(int i=1;i<=n;i++)
for(int j=1;j<=n/i;j++)
factor[i*j].push_back(i);
for(int i=1;i<=n;i++){
for(int j=0;j<factor[i].size();i++)
printf("%d ",factor[i][j]);
puts("");
}
最大公约数
定理:gcd(a,b)*lcm(a,b)=a*b
九章算术·更相减损术
(1).gcd(a,b)=gcd(b,a-b)=gcd(a,a-b)
(2).gcd(2a,2b)=2gcd(a,b)
欧几里得算法:gcd(a,b)=gcd(b,a mod b)
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
互质与欧拉函数
互质:gcd(a,b)=1
欧拉函数:φ(N)
N=p1c1p2c2...pmcm
φ(N)=N((p1-1)/p1)((p2-1)/p2)...((pm-1)/pm)
int phi(int n){
int ans=n;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0)n/=i;
}
if(n>1)ans=ans/n*(n-1);
return ans;
}
性质1~2
(1).n>1,1~n中与n互质的数的和为nφ(n)/2
(2).若gcd(a,b)=1,则φ(ab)=φ(a)φ(b)
积性函数:若gcd(a,b)=1,有f(ab)=f(a)*f(b),那么称函数f为积性函数
性质3~6
(3).f(n)=f(p1c1)f(p2c2)...f(pmcm)
(4).若p|n且p2|n,则φ(n)=φ(n/p)*p
(5).若p|n但p2|n,则φ(n)=φ(n/p)*(p-1)
(6).Σd|nφ(d)=n
以上结论均不给出证明。
原文地址:https://www.cnblogs.com/zhengchang/p/shulun.html
- cf------(round)#1 B. Spreadsheets(模拟)
- sysbench压测MyCAT的shell脚本
- qemu-kvm中vcpu虚拟化到底是咋整的?
- 【给 iOS 开发者】人工智能在 iOS 开发上的应用和机会
- 【Python】Selenium辅助海量基金数据获取
- Django ORM的简单总结
- GO语言标准库概览
- 关于自动化平台的动态菜单设计
- go语言网络编程之tcp
- 实现简单的http并发请求,支持:GET、POST、HEAD、PUT
- 【go语言】Goroutines 并发模式(一)
- 【go语言】Goroutines 并发模式(二)
- 从零开始搭建Nginx和Tomcat的web集群环境
- 【翻译】为什么 goroutine 的栈内存无穷大?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法