尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

用deepseek写的一个求原根的程序
📅 发布时间:2026/6/19 7:57:03

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;

}

相关新闻

  • 阿里巴巴数据库开发手册
  • 数据结构之顺序队列
  • nginx快速实现平滑版本升级

最新新闻

  • 从零开始:PaddleX如何让AI开发像搭积木一样简单?
  • 抖店无货源铺货怎么不违规?拼多多商品违规检测新手合规教程 - 抖掌柜
  • 专业级Canvas富文本编辑器:5分钟实现高质量文档编辑与PDF导出
  • MMC2001 UART与OnCE模块深度解析:寄存器配置、硬件调试与实战避坑
  • 5分钟上手SimLOD:让海量点云数据实时渲染变得简单
  • MC68340定时器与JTAG边界扫描:嵌入式系统时序控制与硬件诊断核心技术解析

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号