关于莫比乌斯函数的应用1

news/2025/10/22 0:51:30/文章来源:https://www.cnblogs.com/triggerz01/p/19156736

include

include

include

include

include

using namespace std;

// 快速幂算法:计算 (a^b) % mod
long long fast_power(long long a, long long b, long long mod) {
long long result = 1;
a = a % mod;

while (b > 0) {if (b & 1) {result = (result * a) % mod;}a = (a * a) % mod;b = b >> 1;
}
return result;

}

// 判断一个数是否为素数
bool is_prime(long long n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;

for (long long i = 5; i * i <= n; i += 6) {if (n % i == 0 || n % (i + 2) == 0) {return false;}
}
return true;

}

// 计算欧拉函数 φ(n)
long long euler_phi(long long n) {
long long result = n;

for (long long p = 2; p * p <= n; ++p) {if (n % p == 0) {while (n % p == 0) {n /= p;}result -= result / p;}
}if (n > 1) {result -= result / n;
}return result;

}

// 获取n的所有质因数
vector get_prime_factors(long long n) {
vector factors;

for (long long p = 2; p * p <= n; ++p) {if (n % p == 0) {factors.push_back(p);while (n % p == 0) {n /= p;}}
}if (n > 1) {factors.push_back(n);
}return factors;

}

// 判断g是否是模n的原根
bool is_primitive_root(long long g, long long n) {
if (gcd(g, n) != 1) {
return false;
}

long long phi_n = euler_phi(n);
vector<long long> prime_factors = get_prime_factors(phi_n);for (long long factor : prime_factors) {if (fast_power(g, phi_n / factor, n) == 1) {return false;}
}return true;

}

// 找到模n的所有原根
vector find_primitive_roots(long long n) {
vector primitive_roots;

// 只有特定的数有原根:1, 2, 4, p^k, 2p^k,其中p是奇素数
if (n == 1) {primitive_roots.push_back(1);return primitive_roots;
}
if (n == 2) {primitive_roots.push_back(1);return primitive_roots;
}
if (n == 4) {primitive_roots.push_back(3);return primitive_roots;
}// 检查n是否是p^k或2p^k的形式
bool has_primitive_root = false;if (is_prime(n)) {has_primitive_root = true;
} else {// 检查是否是p^klong long temp = n;long long p = -1;for (long long i = 2; i * i <= temp; ++i) {if (temp % i == 0) {p = i;while (temp % i == 0) {temp /= i;}break;}}if (temp > 1 && p == -1) {p = temp;temp = 1;}if (temp == 1 && is_prime(p) && p % 2 == 1) {has_primitive_root = true;} else if (n % 2 == 0) {// 检查是否是2p^klong long half_n = n / 2;temp = half_n;p = -1;for (long long i = 2; i * i <= temp; ++i) {if (temp % i == 0) {p = i;while (temp % i == 0) {temp /= i;}break;}}if (temp > 1 && p == -1) {p = temp;temp = 1;}if (temp == 1 && is_prime(p) && p % 2 == 1) {has_primitive_root = true;}}
}if (!has_primitive_root) {return primitive_roots;
}long long phi_n = euler_phi(n);
vector<long long> prime_factors = get_prime_factors(phi_n);// 寻找最小的原根
long long min_primitive_root = -1;
for (long long g = 2; g < n; ++g) {if (gcd(g, n) != 1) {continue;}bool is_root = true;for (long long factor : prime_factors) {if (fast_power(g, phi_n / factor, n) == 1) {is_root = false;break;}}if (is_root) {min_primitive_root = g;break;}
}if (min_primitive_root == -1) {return primitive_roots;
}// 找到所有原根
primitive_roots.push_back(min_primitive_root);// 其他原根是 g^k,其中gcd(k, φ(n)) = 1
for (long long k = 2; k < phi_n; ++k) {if (gcd(k, phi_n) == 1) {primitive_roots.push_back(fast_power(min_primitive_root, k, n));}
}sort(primitive_roots.begin(), primitive_roots.end());return primitive_roots;

}

// 测试函数
int main() {
cout << "求原根的程序" << endl;
cout << "============" << endl;

vector<long long> test_cases = {7, 11, 17, 19, 23, 29, 31};for (long long n : test_cases) {cout << "\n模 " << n << " 的原根:" << endl;vector<long long> primitive_roots = find_primitive_roots(n);if (primitive_roots.empty()) {cout << "  模 " << n << " 没有原根" << endl;} else {cout << "  原根数量: " << primitive_roots.size() << endl;cout << "  原根列表: ";for (size_t i = 0; i < primitive_roots.size(); ++i) {cout << primitive_roots[i];if (i != primitive_roots.size() - 1) {cout << ", ";}}cout << endl;// 验证最小的原根if (!primitive_roots.empty()) {long long g = primitive_roots[0];long long phi_n = euler_phi(n);cout << "  验证最小原根 " << g << ":" << endl;cout << "  ";for (long long i = 1; i <= phi_n; ++i) {cout << fast_power(g, i, n);if (i != phi_n) cout << ", ";}cout << endl;}}
}// 用户输入测试
cout << "\n请输入一个数来求其原根(输入0退出): ";
long long n;
while (cin >> n && n != 0) {vector<long long> primitive_roots = find_primitive_roots(n);if (primitive_roots.empty()) {cout << "模 " << n << " 没有原根" << endl;} else {cout << "模 " << n << " 的原根数量: " << primitive_roots.size() << endl;cout << "原根列表: ";for (size_t i = 0; i < primitive_roots.size(); ++i) {cout << primitive_roots[i];if (i != primitive_roots.size() - 1) {cout << ", ";}}cout << endl;}cout << "\n请输入一个数来求其原根(输入0退出): ";
}return 0;

}

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

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

相关文章

关于莫比乌斯函数的应用

include include include int main() { constexpr int M = 20101009; int n, m; std::cin >> n >> m; if (n > m) std::swap(n, m); std::vector f(n + 1), vis(n + 1), prime; prime.reserve(n); f…

软件工程第三次作业----结对项目

一、作业信息github网址 https://github.com/easytime2000/MathApp这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/?page=3这个作业要求在哪里 https://edu.cnblogs.com/c…

用deepseek写的一个求原根的程序

include include include include include using namespace std; // 快速幂算法:计算 (a^b) % mod long long fast_power(long long a, long long b, long long mod) { long long result = 1; a = a % mod; whil…

操作备忘:在AE中让视频中间部分变慢

目标效果:一个15秒的视频, 1-5秒的部分1倍速播放 5-10秒的部分以0.5倍速播放 10-15秒的部分1倍速播放。 操作如下: 1. 对素材或预合成启用时间重映射 2. 在5秒、10秒处打关键帧(开始变慢与结束变慢的位置): 3.…

记一次精简系统Windows11英文版离线安装中文语言包的过程

最近折腾上了超级精简的Win11系统,就是没有那些乱七八糟的服务的,也没有乱七八糟自带软件的系统,然后看了一圈,发现一个叫Nano11的精简系统非常不错,系统的项目以及下载地址:https://github.com/ntdevlabs/nano11…

阿里巴巴数据库开发手册

下载地址https://8ma.co/res/RMFS3J81.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0px } .zsleft { float: le…

AI元人文:赋能公共治理、司法与监管的价值权衡新范式

AI元人文:赋能公共治理、司法与监管的价值权衡新范式 在当今复杂多元的社会环境中,公共治理、司法审判与行业监管领域面临着日益复杂的价值权衡挑战。经济发展与环境保护、个人权益与公共利益、创新活力与风险防控等…

数据结构之顺序队列

数据结构之顺序队列数据结构之队列 什么是队列队列是和栈一样操作受限的线性表,栈是只允许在线性表的一端进行入栈和出栈操作,而队列是会允许在线性表的一端进行入队,在另外一端进行出队操作队列的基本操作 bool in…

nginx快速实现平滑版本升级

1、解压并编译新版的nginx # 目前版本为1.18,解压一个1.21版本的nginx包 wget https://nginx.org/download/nginx-1.21.0.tar.gz tar -zxf nginx-1.21.0.tar.gz cd nginx-1.21.0/ [root@ubt-server nginx-1.21.0]# ls…

基础的sql练习,全都理解你就是高手了!

以下sql我都是亲测:大多数用法都会在面试当中被问到,切记一步一个脚印的去实现,结果不重要,重要的是你的实现过程的想法,第一步做什么然后第二步做什么等具体的详细过程!(学东西不能贪多,慢慢来) 先从单表查询…

Luogu P11159 【MX-X6-T5】 再生 题解 [ 蓝 ] [ 前缀和 ] [ 组合计数 ]

再生 笑点解析:一开始乘法原理推错式子胡了个依赖链长种类数 \(\le \sqrt n\) 的做法上去。 有了 \(top\) 数组,显然可以求出每个点所处的长链。对于长链上的点,如果链长为 \(x\),那么这条链有 \((x - 1)!\) 种可能…

王浩宇 102500416

这个作业属于:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500416 姓名:王浩宇 书本作业 第一题第二题第三题第四题第五题第六…

102500416 王浩宇

这个作业属于:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业的要求:https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500416 姓名:王浩宇 书本作业 第一题第二题第三题第四题第五题第六…

程序员修炼之路:从小工到专家 读书笔记 2

《程序员修炼之道:从小工到专家》读书笔记(补充篇) 重读《程序员修炼之道》,除了此前感悟的核心原则,书中 “破窗理论”“原型验证”“责任承诺” 等理念,更让我看清从 “完成代码” 到 “掌控开发” 的进阶细节…

程序员修炼之路:从小工到专家 读书笔记 3

《程序员修炼之道:从小工到专家》读书笔记(进阶篇) 三读《程序员修炼之道》,书中 “知识负债”“自动化思想”“沟通协作” 三大被忽略的理念,终于让我触摸到 “专家” 的核心特质 —— 不仅是技术能力的精进,更…

程序员修炼之道:从小工到专家 读书笔记 1

《程序员修炼之道:从小工到专家》读书笔记 翻开《程序员修炼之道:从小工到专家》,没有复杂的代码堆砌,却满是对程序员职业成长的深刻洞察。这本书更像一位资深前辈的经验分享,指引着开发者跳出 “代码搬运工” 的…

解答在同步以太坊事件数据时,如何保证后端服务在 API/RPC 不稳定情况下的可用性

我来详细解答在同步以太坊事件数据时,如何保证后端服务在 API/RPC 不稳定情况下的可用性: 1. 以太坊事件同步的挑战 事件同步的特点 package mainimport ("context""fmt""log""t…

中级问题

我来详细解答这些区块链和 Go 后端开发的问题: 18. Merkle Tree 在区块链中的作用 Merkle Tree 定义 Merkle Tree 是一种二叉树结构,用于高效验证大量数据的完整性。 在区块链中的作用 // 区块链中的 Merkle Tree 应…

20251021周二日记

20251021周二日记这阅读量是怎么回事?有熟人看到吗,哈喽啊/ 今日: 1.早上睡到十点多,紧急去实验室继续报账,填系统,这次应该差不多了。 2.中午统一定的袁记,简单吃完下午上课去,帮报信和写题,下课回549了。 h…

好想好想你

喝了四两酒喝的酒 一股子我们在机场喝的人参酒味 眼前画面一帧一帧 脑子好像灌了水银 身体不由自主 很想你 我要是现在死掉就好了 让我们的故事成为一个完美的童话