数论基础知识(下)

news2024/11/16 3:27:08

目录

欧拉函数

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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java零基础之多线程篇:线程控制

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

RISC-V竞赛|第二届 RISC-V 软件移植及优化锦标赛报名正式开始!

目录 赛事背景 赛道方向 适配夺旗赛 优化竞速赛 比赛赛题&#xff08;总奖金池8万元&#xff01;&#xff09; &#x1f525;竞速赛 - OceanBase 移植与优化 比赛赛程&#xff08;暂定&#xff09; 赛事说明 「赛事背景」 为了推动 RISC-V 软件生态更快地发展&#xff0…

健身动作AI识别,仰卧起坐计数(含UI界面)

用Python和Mediapipe打造&#xff0c;让你的运动效果一目了然&#xff01; 【技术揭秘】 利用Mediapipe的人体姿态估计&#xff0c;实时捕捉关键点&#xff0c;精确识别动作。 每一帧的关键点坐标和角度都被详细记录&#xff0c;为动作分析提供数据支持。 支持自定义动作训练&a…

Jave-this关键字

目录 1.this关键字 先看一段代码&#xff0c;并分析问题 什么是this 案例演示 2.this的注意事项和使用细节 1.this关键字 先看一段代码&#xff0c;并分析问题 什么是this this就 代表的是当前对象。 this可以大概理解成“我的” &#xff0c;比如我的书包&#xff0c;这…

基于Java中的SSM框架实现大创项目申报管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现大创项目申报管理系统演示 摘要 经济的高速发展进一步推动了种类繁多的项目落地&#xff0c;传统的项目在申报过程中主要通过纸质文件的方式实现申报信息的传递&#xff0c;同时不同的项目内容所对应的申报资料模板也有所差异&#xff0c;人工整理的提…

没有显卡,怎么玩AI绘图?

或许很多人跟我一样&#xff0c;没有显卡&#xff0c;但又很想玩AI绘图&#xff0c;但本地绘图怕是无缘了&#xff0c;只能借助云GPU的方式了。 今天跟大家分享一下一个简单目前可白嫖无门槛的方法实现无显卡也能玩AI绘图。 方案就是ComfyUIBizyAir云节点。 ComfyUI介绍 来…

【软考】虚拟存储器

目录 1. 说明2. 定义3. 工作原理4. 管理方式5. 优点6. 例题6.1 例题1 1. 说明 1.在概念上&#xff0c;可以将主存存储器看作一个由若干个字节构成的存储空间&#xff0c;每个字节(称为一个存储单元)有一个地址编号&#xff0c;主存单元的该地址称为物理地址(Physical Address)…

数值分析——三次样条插值

系列文章目录 数值分析——拉格朗日插值 数值分析——牛顿插值多项式 数值分析——埃尔米特&#xff08;Hermit&#xff09;插值 数值分析——分段低次插值 文章目录 系列文章目录前言一、理论推导1.三次样条函数2.三次样条插值函数的求解条件3.三次样条插值函数的建立 二、MA…

简单反射型XSS的复现

xss反射型攻击&#xff1a; 1.最简单的漏洞复现&#xff1a; 这里我们有一个最简单的网页&#xff1a;由于地址不存在&#xff0c;所以图片加载不出来。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta…

FP8量化

https://arxiv.org/html/2402.16363v5 LLama3.1用了FP8量化&#xff1a; FP8也可以用scaling factor来扩大表示范围&#xff0c;对吧&#xff1f;

开源在线剪切板 PrivateBin 安装和使用教程

我们经常需要在网上快速分享一些文本内容&#xff0c;比如代码片段、临时笔记或者敏感信息。传统的在线剪贴板服务虽然使用方便&#xff0c;但往往缺乏足够的隐私保护。 那么&#xff0c;有没有一种既方便又安全的在线文本分享方式呢&#xff1f;今天我要向大家推荐一个优秀的…

常见的图像融合方法

这里我们将介绍一些常用的图像融合方式&#xff0c;并不涉及到诸如CutMix、MixUp、TokenMix、Mosaic、Copy-Paste等图像增强方法。 首先是读取图像&#xff0c;我们这边采用了PIL库进行&#xff0c;那么读进来就应该是一个Image对象。下面介绍Image对象与array的转换方式。 f…

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测

土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译&#xff0c;可获取历史或当前任何一个区域的土地利用/土地覆盖数据&#xff0c;用于评估区域的生态环境变化、评价重大生态工程建设成效等。借助CLUE模型&#xff0c;实现对未来土…

AI9-文本识别

本章主要介绍文本识别算法的理论知识,包括背景介绍、算法分类和部分经典论文思路。 通过本章的学习,你可以掌握: 1. 文本识别的目标 2. 文本识别算法的分类 3. 各类算法的典型思想 1 背景介绍 文本识别是OCR(Optical Character Recognition)的一个子任务,其任务为识别一个…

pytorch的入门使用

pytorch安装略&#xff01; 一.张量Tensor 张量是一个统称其中包含0阶&#xff0c;1阶&#xff0c;2阶&#xff0c;3阶&#xff0c;4阶&#xff0c;.......n阶。 0阶&#xff1a;标量&#xff0c;常数&#xff0c;0-D Tensor 1阶&#xff1a;向量&#xff0c;1-D Tensor 2…

使用java反编译工具jad

文章目录 反编译工具 JAD下载配置环境变量使用其他反编译工具 JD-GUI 反编译工具 JAD 反编译是指将编译后的字节码文件&#xff08;.class 文件&#xff09;转换回可读的 Java 源代码。JAD (Java Decompiler) 是一个经典的反编译工具&#xff0c;广泛用于将 Java 字节码反编译…

国内AI大模型168个,哪个最有前途?

168个国产大模型&#xff0c;都是什么来头&#xff1f; 1785年&#xff0c;瓦特改进了蒸汽机&#xff0c;人类从此摆脱了手工业的桎梏&#xff0c;迈向辉煌的蒸汽时代。 1870年&#xff0c;第二次工业革命光芒四溢&#xff0c;人类踏上了电气时代的漫长征程。 20世纪70年代后…

手机有两个卡槽分别放什么卡,这篇文章建议收藏!

你发现了吗&#xff0c;我们现在对于手机卡的需求是越来越大了&#xff0c;相信大多数用户手上都不止一张SIM卡&#xff0c;大部分都是双卡&#xff0c;甚至三卡了&#xff0c;那么&#xff0c;这些卡槽你真的利用对了吗&#xff1f; 这篇文章就告诉大家&#xff0c;如何更好的…

【Windows】Beyond Compare 5(文件数据对比神器) 软件介绍

今天给大家介绍的软件叫Beyond Compare&#xff0c;这是一个文件数据对比神器&#xff0c;可以让你从茫茫数据、文字中解放出来。 Beyond Compare 是一款功能强大的文件和文件夹比较工具&#xff0c;主要用于比较和同步文件、文件夹及其内容。以下是该软件的主要特点和功能&…

一款免费开源的在线白板,手绘风格在线画图神器

Excalidraw 是一款开源的虚拟手绘风格在线白板工具&#xff0c;它专注于提供简单、直观且功能丰富的绘图体验。这款工具特别适合用于创建图表、线框图、思维导图、流程图以及其他各种类型的图形和视觉内容。 Excalidraw 的主要特点包括&#xff1a; 免费开源&#xff1a;Exca…