素数

判断素数小程序遇到的问题

落花浮王杯 提交于 2019-11-30 05:46:05
程序: #include <stdio.h> #include<math.h> int panduan(int n) { int i=2; for(i=2;i<=sqrt(n);i++) { if(n%i==0) { return 0; } } return 1; } int main() { int i; for(i=100;i<=200;i++) { if(panduan(i)) { printf("%d\n",i); } } return 0; } 刚开始编译报错,提示不认识sqrt()函数,加入math.h,但再次gcc编译时,任然报错,后在网上查找,需在命令后面加上-lm,即可解决。 说是缺少库,但具体细节未知。 来源: https://blog.csdn.net/weixin_44290548/article/details/101111000

Miller-Rablin与Pollard-Rho算法(素性测试与质因数分解)

坚强是说给别人听的谎言 提交于 2019-11-30 03:51:40
前置 费马小定理(即若P为质数,则 \(A^P\equiv A \pmod{P}\) )。 欧几里得算法(GCD)。 快速幂,龟速乘。 素性测试 引入 素性测试是OI中一个十分重要的事,在数学毒瘤题中有着举足轻重的地位。 常见的素性测试如下: int check(int N){ for(int i=2;i*i<=N;i++) if(N%i==0)return 0; return 1; } 以上是一个 \(O(\sqrt{N})\) 的算法,虽然不优,但在绝大多数情况下是可以的。 但是,假如 \(N\) 的范围达到了 \(1e18\) ,以上算法很明显就不行了,我们得考虑更优的算法。 引入Miller-Rablin算法。 定理1 定理1:如果 \(P\) 为一个 大于2 的素数,那么方程 \(X^2\equiv1 \pmod{P}\) 的解只有1或者-1。 (是真得水的) 证明如下: 由 \(X^2\equiv1 \pmod{P}\) ,得 \((X^2-1)\equiv0 \pmod{P}\) , 即 \({(X+1)(X-1)}\equiv0 \pmod{P}\) 。 则 \(P | (X+1)\) 或 \(P|(X-1)\) , 即 \((X+1)\equiv0 \pmod{P}\) 或 \((X-1)\equiv0 \pmod{P}\) 。 则 \(X\equiv-1

Chapter8~条件和循环

♀尐吖头ヾ 提交于 2019-11-30 03:14:27
8-1. 条件语句。请看下边的代码: # statement A if x > 0: #statement B pass elif x < 0: #statement C else: #statement D pass #statement E (a)如果 x<0 ,上面哪个语句(A,B,C,D,E)将被执行? (b)如果x == 0,上面哪个语句将被执行? (c)如果x>0,上面那个语句将被执行? C、D、B 8-2 循环。编写一个程序,让用户输入3个数字:(f)rom,(t)o和(i)ncrement。以i为步长从f计数到t,包括f和t。例如,如果输入的是f == 2、t==26、i==4,程序将输出2,6,10,14,18,22,26. 8–3. range() . 如果我们需要生成下面的这些列表, 分别需要在 range() 内建函数中提供那些参数? (a) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (b) [3, 6, 9, 12, 15, 18] (c) [-20, 200, 420, 640, 860] (a)print range(0, 10) (b)print range(3, 21, 3) (c)print range(-20, 980, 220) 8–4. 素数. 我们在本章已经给出了一些代码来确定一个数字的最大约数或者它是否是一个素数.

素数筛模板

主宰稳场 提交于 2019-11-30 02:12:19
   素数筛即埃氏筛法,找出小于等于给定数的所有素数个数。 大致思路就是空间换时间:首先建立数组将所有数设为true,从2开始,因为2为true,所以2为素数,然后将2的所有倍数设为false;再对3进行相同判定,以此类推。 1 int prime[Max_N]; //第i个素数 2 bool is_prime[MAX_N + 1]; //is_prime[i]为true表示i是素数 3 4 int sieve(int n){ 5 int p = 0; 6 for(int i=0;i<=n;i++) is_prime[i] = true; 7 for(int i=2;i<=n;i++) { 8 if(is_prime[i]) { 9 prime[p++] = i; 10 for(int j=2*i;j<=n;j+=i) is_prime[j] = false; 11 } 12 } 13 return p; 14 }    然后进阶的就是欧拉筛,即给定一个区间[a,b),找出区间内所有素数个数。   在前面的素数筛中,若循环中一个较大的素数x,开始筛他的倍数时,2x因为是2的倍数,所以已经在x=2时筛掉了;3x是3的倍数,也已经在x=3时筛掉了……。因此x需要筛掉的就只是x 2 之后的数。因此循环条件可以缩小至0~√b 即可。   这里我设置了两个数组,一个表示a~b之间的数

自测-2 素数对猜想

为君一笑 提交于 2019-11-30 02:08:37
题目 让我们定义 d​n​​为:d​n​​=p​n+1​​−p​n​​ ,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数N。 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 代码(c) #include <stdio.h> #include <math.h> void FindZhiShu(); int ZhiShu[99999]; int main() { int range ; scanf("%d",&range); if ( range >= 100000 || range == 1 ) printf("out of range\n"); else FindZhiShu(range); return 0; } void FindZhiShu(int r) { long int j, l, range1; int k=1, sum=0; ZhiShu[0]=2; for(int i=3;i<=r;i++) { int flag = 1; range1=sqrt(i); for(j=2;j<=range1;j++) { if(i%j=

Uva11762 Race to 1——有向无环图&&记忆化搜索

半城伤御伤魂 提交于 2019-11-30 01:28:46
题意 给出一个整数 $N$,每次可以在不超过 $N$ 的素数中等概率随机选择一个 $P$,如果 $P$ 是 $N$ 的约数,则把 $N$ 变成 $N/P$,否则 $N$ 不变。问平均情况下需要多少次随机选择,才能把 $N$ 变成1呢? 分析 本题可以画出一个状态转移图, 例如 $n=6$ 时, $n$ 的每个约数都对应一个状态,每个状态转移都有一定概率,从每个状态出发转移的概率和为1. 设 $f(i)$ 表示当前的数为 $i$ 时接下来需要选择的期望次数,可列出方程: $$f(6) = 1 + f(6)/3 + f(3)/3 + f(2)/3$$ 一般地,设不超过 $x$ 的素数有 $p(x)$ 个,其中有 $g(x)$ 个是 $x$ 的因子,则 $$f(x) = 1 + f(x) \times [1 - \frac{g(x)}{p(x)}] + \sum_{x | y} \frac{f(x/y)}{p(x)}$$ 即 $$f(x) = \frac{\sum _{x|y}f(x/y) + p(x)}{g(x)}$$ 边界为 $f(1)=0$,因为 $x/y < x$(即形成的是有向无环图),可以用记忆化搜索的方式 计算 $f(x)$,否则就要用高斯消元了。 #include<bits/stdc++.h> using namespace std; //返回n以内素数的个数 /

ElGamal算法的基本原理及实现

送分小仙女□ 提交于 2019-11-30 01:16:03
1、准备步骤 1)取大素数 p 和 g(g < p,g 最好是 p 的素根) 注解:若 a 是素数 p 的一个素根,则 a mod p, a^2 mod p , …, a^p-1 mod p 是 1 到 p - 1 的排列 2)随机选取一整数 x (1 <= x <= (p - 2),(p,g,x) 是私钥) 3)计算 y = g^x (mod p) ( (p,g,y) 是公钥) 2、加密过程 1)随机选取一整数 k (1 <= k <= (p - 2) 且 k 与 (p - 1) 互素) 2)计算 a = g^k mod p,b = m*y^k mod p(m 为要加密的明文) 3)密文 C = (a, b) 3、解密过程 1)m = b * a^(-x) mod p 注解:ba^(-x) mod p Ξ m * y^k * g^(-xk) Ξ m * g^(xk) * g^(-xk) Ξ m 加密及解密的实现: 1 import java.util.ArrayList; 2 3 public class Main { 4 static ArrayList<Integer> suArr = new ArrayList<>(); 5 public static void main(String[] args) { 6 int max = 8096, p, g, x, y, k, a

luogu P1045 麦森数

倖福魔咒の 提交于 2019-11-30 00:08:13
https://www.luogu.org/problem/P1045 题目描述 形如 2 P − 1 2^{P}-1 2 P − 1 的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果PPP是个素数, 2 P − 1 2^{P}-1 2 P − 1 不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。 任务:从文件中输入PPP(1000<P<3100000),计算 2 P − 1 2^{P}-1 2 P − 1 的位数和最后500位数字(用十进制高精度数表示) 输入格式 文件中只包含一个整数P(1000<P<3100000) 输出格式 第一行:十进制高精度数 2 P − 1 2^{P}-1 2 P − 1 的位数。 第2-11行:十进制高精度数 2 P − 1 2^{P}-1 2 P − 1 的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0) 不必验证 2 P − 1 2^{P}-1 2 P − 1 与P是否为素数。 输入输出样例 输入 #1 1279 输出 #1 386 00000000000000000000000000000000000000000000000000

Python练习题二

我与影子孤独终老i 提交于 2019-11-29 22:41:41
1、实现计算求最大公约数和最小公倍数的函数。 def gcd_lcm(a,b): a1 = a b1 = b while True: r = a % b if r == 0: print("最大公约数为%d" % b) print("最小公倍数为%d" % (a1* b1 / b)) break else: a = b b = r return c=int(input()) d=int(input()) gcd_lcm(c,d) 2、实现判断一个数是不是回文数的函数。 def num(x): x1=x y=0 while x>0: y=y*10+x%10 x=x//10 if x1==y: print("%d是回文数"%x1) else: print("%d不是回文数"%x1) a=int(input()) num(a) 3、实现判断一个数是不是素数的函数。 import math def prime(x): sx=int(math.sqrt(x))+1 a=True for i in range(2,sx): if x%i==0: a=False break if a==True and x!=1: print("%d是素数"%x) else: print("%d不是素数"%x) b=int(input()) prime(b) 4、写一个程序判断输入的正整数是不是回文素数。

数据结构(二)-求<=N

我们两清 提交于 2019-11-29 14:54:57
Q:求解小于或等于整数N的最大素数 A:穷举法枚举从N到√N,逐个用2到√N的数去整除,若能除尽则不是素数。 tips:如果一个整数N不是素数,它一定可以分解为比它小的两个整数的乘积,其中一个乘数小于或等于根号n,另一个大于或等于根号n。 怎么证明最大素数一定在根号n到n之间出现? 来源: https://www.cnblogs.com/SUMaywlx/p/11520069.html