首页 > 其他分享 >数论基础知识(下)

数论基础知识(下)

时间:2024-08-06 18:54:00浏览次数:9  
标签:函数 数论 质数 基础知识 int st 欧拉 mod

目录

欧拉函数

n的分解质因数求欧拉函数

试除法求欧拉函数值

积性函数

筛法

朴素筛

埃氏筛

欧拉筛 (线性筛)

线性筛欧拉函数

快速幂

同余

欧拉定理

费马小定理

乘法逆元

欧拉函数
互质 : a , b N ,若 gcd ( a , b ) = 1 ,则 a , b 互质。 定义:  : 1 n 中与 n 互质的数的个数被称为欧拉函数,记作 φ ( n ) ,即

n的分解质因数求欧拉函数

#include<iostream>
#include<algorithm>
using namespace std;
int eulerphi(int n) {
	int p = n;
	for (int i = 2; i * i < n; i++) {
		if (n % i == 0) {
			p = p / i * (i - 1);
			while (n % i == 0) {
				n /= i;
			}
		}
	}
	if (n > 1) {
		p = p / n * (n - 1);
	}
	return p;
}
int main() {
	int n;
	while (cin >> n) {
		cout << eulerphi(n) << endl;
	}
	return 0;

}

  1. 函数 eulerphi 用于计算给定整数 n 的欧拉函数值。

    • 首先初始化变量 p 为 n ,用于保存计算过程中的中间结果。
    • 然后通过一个从 2 开始到小于 n 的平方根的循环,依次检查每个数 i 是否能整除 n 。
    • 如果能整除,就更新 p 的值为 p / i * (i - 1) ,并通过一个内层循环将 n 中包含的该质因数全部除去。
    • 循环结束后,如果 n 仍然大于 1 ,说明 n 本身就是一个质数,再次更新 p 的值为 p / n * (n - 1) 。
    • 最后返回计算得到的欧拉函数值 p 。
  2. 在 main 函数中:

    • 定义了一个整数 n 。
    • 通过一个 while 循环,不断读取用户输入的整数 n 。
    • 对于每个输入的 n ,调用 eulerphi 函数计算其欧拉函数值,并将结果输出到控制台。

总的来说,这段代码的主要目的是根据输入的整数计算并输出其对应的欧拉函数值,核心在于通过分解质因数来逐步计算欧拉函数。

试除法求欧拉函数值
int phi(int x) {
int res = x;
for (int i = 2; i * i <= x; i ++) {
if (x % i == 0) {
res = res / i * (i - 1);
while (x % i == 0) {
x /= i;
}
}
}
if (x > 1) {
res = res / x * (x - 1);
}
return res;
}
积性函数
定义 n Z +,有数论函数 f ( n ) 满足 a , b , gcd ( a , b ) = 1 使得 f ( a × b ) = f ( a ) × f ( b ) ,则称 f (n) 为积性函数。 常见的积性函数

筛法
朴素筛
枚举 i [2 , n ] ,标记 i 的倍数 2 × i , 3 × i , · · · 没被标记过的数就是质数。
vector<int> primes;
vector<bool> st;
void sieve(int n) {
    st.resize(n + 1);
    for (int i = 2; i <= n; i++) {
        if (!st[i]) {
            primes.push_back(i);
        }
        for (int j = 2 * i; j <= n; j += i) {
            st[j] = true;
        }
    }
}
埃氏筛
对朴素筛进行优化,只需要考虑质数的倍数。 在枚举倍数时,因为 i × (2 i 1) 已经被 2 i 1 标记过,所以可以从 i *i 开始。
vector<int> primes;
vector<bool> st;
void sieve(int n) {
    st.resize(n + 1);
    for (int i = 2; i <= n; i++) {
        if (!st[i]) {
            primes.push_back(i);
            for (int j = i * i; j <= n; j += i) {
                st[j] = true;
            }
        }
    }
}
欧拉筛 (线性筛)
考虑每个数的最小质因子。 维护一个质数数组,每次遍历 i 的时候从小到大枚举已有的每个质数 p p | i 时, p 一定是 i 的最小质因子,那么也一定是 i × p 的最小质因子。 p i 时,那么 p 一定比 i 的最小质因子小,所以 p 也一定是 i × p 的最小质因子。
vector<int> primes;
vector<bool> st;
void sieve(int n) {
    st.resize(n + 1);
    for (int i = 2; i <= n; i++) {
        if (!st[i]) {
            primes.push_back(i);
        }
        for (auto p : primes) {
            if (i * p > n) {
                break;
            }
            st[i * p] = true;
            if (i % p == 0) {
                break;
            }
        }
    }
}
线性筛欧拉函数
i 为质数, φ ( i ) = i 1 p | i 时,由于 p 已经是 i 的最小质因子,所以 φ ( i × p ) = φ ( i ) × p p i 时,此时 p i × p 的一个新的最小质因子,所以 φ ( i × p ) = φ ( i ) × ( p 1)
vector<int> primes, euler;
vector<bool> st;
void sieve(int n) {
    st.resize(n + 1), euler.resize(n + 1), euler[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (!st[i]) {
            euler[i] = i - 1, primes.push_back(i);
        }
        for (auto p : primes) {
            if (i * p > n) {
                break;
            }
            st[i * p] = true;
            if (i % p == 0) {
                euler[i * p] = euler[i] * p;
                break;
            }
            euler[i * p] = euler[i] * (p - 1);
        }
    }
}
快速幂
定义 : 快速幂可以 O ( log n ) 计算a^{^{n}}mod p 考虑将指数用二进制来表示。最多有\left \lfloor log_{n} \right \rfloor + 1 个二进制位。所以只需要用 O ( log n ) 次乘 法就可以算出答案。
int power(int a, int n, int p) {
    int res = 1;
    while (n) {
        if (n & 1) {
            res = 1LL * res * a % p;
        }
        a = 1LL * a * a % p;
        n >>= 1;
    }
    return res;
}
同余
定义 : 若整数 a , b 除以正整数 m 所得的余数相等,则称 a , b m 同余。记作 a b ( mod m ) 性质 性质 整除性: m | ( a b ) ,即 a b = k × m , k Z 传递性: a b ( mod m ) , b c ( mod m ) a c ( mod m ) 基本运算: a b ( mod m ) , c d ( mod m ) a ± c b ± d ( mod m ) a b (mod m ) , c d (mod m) a × c b × d (mod m ) a b (mod m ) a × n b × n (mod m), n Z 除法原理:若 k × a k × b ( mod m ) ,且 k , m 互质,则 a b (mod m )
欧拉定理
定义 : 若正整数 a , m 满足 gcd ( a , m) = 1,
费马小定理
定义: 若质数 p 和正整数 a 满足 gcd ( a , p ) = 1,则^{_{^{^{}}}}a^{^{p-1}} 1 ( mod p ) 证明:由于 φ ( p ) = p 1 其中 p 为质数,所以根据欧拉定理得 a^{^{p-1}} 1 ( mod p )
乘法逆元
定义:ax ≡ 1 ( mod p ) ,则称 x a p 意义下的乘法逆元。记作 a^{^{-1}} 费马小定理求逆元:
int inv(int a, int p) {
return power(a, p - 2, p);
}

标签:函数,数论,质数,基础知识,int,st,欧拉,mod
From: https://blog.csdn.net/u014114223/article/details/140818274

相关文章

  • FreeRTOS基础知识详细版
    RTOS概念‌‌‌‌‌‌RTOS全称是RealTimeOperatingSystem,中文名就是实时操作系统,提供了任务调度、内存管理、中断处理等功能。‌1.任务调度:裸机编程需要手动调度任务,而RTOS提供自动的任务调度器。2.硬件管理:裸机编程需要开发者手动管理硬件资源,RTOS提供了......
  • python入门(1)基础知识介绍
    print函数a=10print(a)print(10)print("您好")print(a,b,"您好")print(chr(98))#chr将98转换为ASVCII值print("你好"+"上海")#都是字符串可以用+连接输出print('您好',end='不换行')#修改结束符,不换行,否则自动视为有\nfp=open("note.txt&......
  • leetcode数论(2453. 摧毁一系列目标)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给你一个下标从 0......
  • leetcode数论(326. 3 的幂)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。描述给定一个整数,写一个......
  • 5.8软件工程基础知识-项目管理
    项目管理范围管理产品范围和项目范围管理过程WBS练习题进度管理基本原则过程活动资源估算软件规模估算方法进度安排关键路径法练习题成本管理过程成本的类型练习题软件配置管理配置项配置基线配置数据库练习题质量管理过程质量模型软件评审软件容错技术练习题风险......
  • Spring基础知识学习总结(一)
    一.基础介绍Spring是一个轻量级Java开发框架,最早有RodJohnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEEfull-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发......
  • linux 基础知识汇总
    1、Linux文件系统概述Linux文件系统是指操作系统用来控制文件如何存储和检索的结构和逻辑。文件系统结构根目录:/Linux文件系统从根目录(/)开始,这是所有文件和目录的起点。目录结构:Linux使用层次化目录结构,每个目录包含文件和子目录。挂载点:各种文件系统通过挂载点(mo......
  • Arcgis基础知识-地理信息系统基本概念
    Arcgis基础知识-地理信息系统基本概念​一、基本概念地理信息系统(GeographicInformationSystem,简称GIS)是一种采集、存储、管理、分析、显示与应用地理信息的计算机系统,是分析和处理海量地理数据的通用技术。简单来说对空间数据的显示,编辑处理,分析应用,打印输出的系统。......
  • 【Java基础知识4】反射
    一、反射机制Java反射机制是指在程序的运行过程中,对于任意一个类,都能够知道它的所有属性和方法;对于任意一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为JAVA语言的反射机制二、反射的核心内容反射的核心内容是JVM在运行时动态......
  • 【Java基础知识3】泛型
    一、泛型的意义泛型的本质是将类型参数化,从而达到代码复用。即:在不创建新的类型下,通过泛型指定不同类型来控制形参具体类型,简单来讲就是,当我们不知道用什么数据类型接收数据的情况下,可以使用泛型来接收。代码示例:未使用泛型情况下:privatestaticintadd(inta,intb){......