loj #143. 质数判定

\(\color{#0066ff}{ 题目描述 }\)

判定输入的数是不是质数。

\(\color{#0066ff}{输入格式}\)

若干行,一行一个数 \(x\)。

行数不超过 \(10^5\)。

\(\color{#0066ff}{输出格式}\)

对于输入的每一行,如果 \(x\) 是质数输出一行 \(Y\),否则输出一行 \(N\)。

\(\color{#0066ff}{输入样例}\)

1
2
6
9
666623333

\(\color{#0066ff}{输出样例}\)

N
Y
N
N
Y

\(\color{#0066ff}{数据范围与提示}\)

\(1≤x≤10^{18}\)。

\(\color{#0066ff}{ 题解 }\)

就是个Miller Rabbin的板子题

详解

#include<bits/stdc++.h>
#define LL long long
LL in() {
    char ch; LL x = 0, f = 1;
    while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
    for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
    return x * f;
}
int prime[] = {2, 3, 5, 7, 11, 61, 24251};
LL msc(LL x, LL y, LL mod) {
    x %= mod;
    y %= mod;
    LL c = (long double)x / mod * y;
    LL d = x * y - c * mod;
    return ((d % mod) + mod) % mod;
}
LL ksm(LL x, LL y, LL mod) {
    LL re = 1LL;
    while(y) {
        if(y & 1) re = msc(re, x, mod);
        x = msc(x, x, mod);
        y >>= 1;
    }
    return (re + mod) % mod;
}
bool judge(LL a, LL p) {
    LL s = p - 1;
    while(!(s & 1)) s >>= 1;
    LL k = ksm(a, s, p);
    while (s != p - 1 && k != 1 && k != p - 1) k = msc(k, k, p), s <<= 1;
    return (k == p - 1) || ((s & 1));
}
bool judge(LL n) {
    if(n == 1) return false;
    for(int i = 0; i < 7; i++) {
        if(n == prime[i]) return true;
        if(n % prime[i] == 0) return false;
        if(!judge(prime[i], n)) return false;
    }
    for(int i = 1; i <= 10; i++) if(!judge(2 + rand() % (n - 2), n)) return false;
    return true;
}

int main() {
    LL n;
    while(~scanf("%lld", &n)) printf(judge(n)? "Y\n" : "N\n");
    return 0;
}

原文地址:https://www.cnblogs.com/olinr/p/10305930.html

时间: 2024-08-30 09:12:20

loj #143. 质数判定的相关文章

hihocoder 1287 : 数论一&#183;Miller-Rabin质数测试 大质数判定

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近突然对密码学产生了兴趣,其中有个叫RSA的公钥密码算法.RSA算法的计算过程中,需要找一些很大的质数. 小Ho:要如何来找出足够大的质数呢? 小Hi:我倒是有一个想法,我们可以先随机一个特别大的初始奇数,然后检查它是不是质数,如果不是就找比它大2的数,一直重复,直到找到一个质数为止. 小Ho:这样好像可行,那我就这么办吧. 过了一会儿,小Ho拿来了一张写满数字的纸条. 小Ho:我用程序随机生成了一些初

c++质数判定及输出质数表

本程序提示用户输入最大值,以此为范围,从最小质数2开始举判断质数,输出质数表.代码如下: 1 // 素数表.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 6 7 int main() 8 { 9 int x = 2,y=1,b,line=0; //x最小质数2为枚举起点,y初值为1,之后递加1,b范围内最大质数,line每行输出的数的数量 10 cout << "请输入最大值:"; 11 cin

RSA简介(三)——寻找质数

要生成RSA的密钥,第一步就是要寻找质数,本节专讲如何寻找质数. 我们的质数(又称素数).合数一般是对正整数来讲,质数就是只有1和本身两个的正整数,合数至少有3个约数,而1既不是合数也不是质数. 质数有无穷多个,这个早在古希腊时期就被证明了,使用反证法很容易证明:假设质数只有有限多,分别为a1.....an,则a1*a1....*an+1大于所有的质数,却不以任何质数为约数,推出矛盾,从而假设错误. 在质数的分布上,有个定理: lim ∏ (n)/(n/ln(n)) = 1 n→∞  其中∏ (

计算机算法常用术语中英对照(分为两部分 其中一部分表格形式 )

第一部分 Data Structures 基本数据结构 Dictionaries 字典 Priority Queues 堆 Graph Data Structures 图 Set Data Structures 集合 Kd-Trees 线段树 Numerical Problems 数值问题 Solving Linear Equations 线性方程组 Bandwidth Reduction 带宽压缩 Matrix Multiplication 矩阵乘法 Determinants and Perm

【转】编程词汇

很实用的编程英语词库,共收录一千五百余条词汇. 第一部分: application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语

【转】Java 专业词汇

原址:http://blog.csdn.net/xiaojunjuns1/article/details/52729861 abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm                     n.算法 ['.lg.riem] annotation                     [Java

计算机英语词汇--算法

算法常用术语中英对照Data Structures 基本数据结构Dictionaries 字典PriorityQueues 堆Graph Data Structures 图Set Data Structures 集合Kd-Trees 线段树Numerical Problems 数值问题Solving LinearEquations 线性方程组Bandwidth Reduction 带宽压缩Matrix Multiplication 矩阵乘法Determinants and Permanents

常用/常考算法总结

转自tangjz的博客... 基础算法 模拟 搜索 广度优先搜索(BFS) 优化:双向BFS 深度优先搜索(DFS) 优化:折半DFS 迭代加深搜索(IDS) 启发式搜索(Astar) 优化:IDAstar 优化:剪枝.位运算 排序 冒泡排序/选择排序 基数排序/桶排序 计数排序 插入排序/希尔排序 快速排序 归并排序/求逆序对数 堆排序 贪心 分治 二分/三分/n分 cdq分治 倍增/ST 离散化 二分答案 快速幂/十进制快速幂 基础数学 数列求和 泰勒展开 矩阵 矩阵乘法 高斯消元 判断线性

跨越千年的RSA算法

跨越千年的RSA算法 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中.直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一.最近我在<程序员>杂志上连载了<跨越千年的 RSA 算法>,但受篇幅限制,只有一万字左右的内容.其实,从数论到 RSA 算法,里面的数学之美哪里是一万字能扯完的?在写作的过程中,我查了很多资料,找到了很多漂亮的例子,也积累了很多个人的思考