“天意终究难参,假若登顶成憾,与君同添青史几传,成败也当笑看|

zsdqwq

园龄:3年6个月粉丝:9关注:17

2022-04-07 21:31阅读: 71评论: 0推荐: 0

初等数论

前言

感觉最近状态不是很好,写一篇笔记吧,

但是有感觉不知道写什么好,就写一篇总结吧 qwq

正文

Part.1

  • 基础筛法

其实就是每一步都判断一次,再加一步的优化;

bool isprime(int x){
    if(x<=1) return 0;
    for(int i=2;i<=sqrt(x);i++){
	  if(x%i==0) return 0;
    }
    return 1;
}
  • 埃氏筛法

时间复杂度: O(n log log n)

还可以,但是还是有些慢,

主要的原理就是从 2 开始,把每一个数的倍数都进行一次标记;

void isprime() {
    bool p[1000001];
    memset(p, 0, sizeof(p));
    p[0] = p[1] = false;
    for (int i = 2; i <= sqrt(n); i++) {
	 if (p[i]) {
	      for (int j = 2 * i; j <= n; j += i) {
                    p[i] = false;
	      }
	 }
    }
}
  • 线性筛(欧式筛)

时间复杂度:O(N)

从小到大不断累计因子;

void init() {
  phi[1] = 1;
  for (int i = 2; i < MAXN; ++i) {
    if (!vis[i]) {
      phi[i] = i - 1;
      pri[cnt++] = i;
    }
    for (int j = 0; j < cnt; ++j) {
      if (1ll * i * pri[j] >= MAXN) break;
      vis[i * pri[j]] = 1;
      if (i % pri[j]) {
        phi[i * pri[j]] = phi[i] * (pri[j] - 1);
      } else {
        // i % pri[j] == 0
        // 换言之,i 之前被 pri[j] 筛过了
        // 由于 pri 里面质数是从小到大的,所以 i 乘上其他的质数的结果一定会被
        // pri[j] 的倍数筛掉,就不需要在这里先筛一次,所以这里直接 break
        // 掉就好了
        phi[i * pri[j]] = phi[i] * pri[j];
        break;
      }
    }
  }
}

Part.2 PrimeNumbers

ϕ(n)表示 1n 中,与 n 互质的正整数的个数;

定义:

ϕ(n)=n11p1(11p2)(11pn)

其中,p1p2 ……直到 pn 都是 n 的质因数;

ϕ(n)也有许多好玩的性质Link

因为懒,所以请直接食用那篇文章;

int ph[1000001];
void phi(int n) {
    for (int i = 2; i <= n; i++) {
	ph[i] = i;
    }
    for (int i = 2; i <= n; i++) {
	for (int j = i; j <= n; j++) {
	    ph[j] = ph[j] / i * (i - 1);
	}
    }
}

Part.3

gcd,欧几里得算法,所谓的辗转相除

int gcd(int a,int b)
{
    return b ? gcd(b,a%b) : a;
}

当然,提到了欧几里得算法,就可以来看一眼拓展欧几里得,

给定任意两数 ab

来看下面这个等式(当然如果你愿意也可以叫不定方程):

ax+by=gcd(a,b)

我们管解这个方程(其实是一种丢番图方程)的算法叫做拓展欧几里得;

如果求出来了一组特解就可以求出来这个方程的通解

求出来这玩意其实就是为了来求一个叫做逆元的东西;

顺便提一下逆元,

这个式子中,a×x1(modm) 我们称 xa 关于 m 的乘法逆元;

int gcd(int a, int b,int &x,int &y) {
      if (b == 0) {
	  x = 1, y = 0;
	  return a;
      }
      int ans = gcd(b, a % b, x, y);
      int temp = x;
      x = y;
      y = temp - a / b * y;
      return ans;
}

也有许多好玩的性质Link

感觉自己没那个水平写成那样,再引用一篇

结尾

差不多就这些吧,想不出来写点啥了,如果有可以补充欢迎留言

本文作者:zsdqwq

本文链接:https://www.cnblogs.com/wo-de-bo-ke-wo-zuo-zhu/p/Legends_never_die.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   zsdqwq  阅读(71)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示