UVa 10006 Carmichael Numbers(数论&卡米歇尔数&考塞特判别法)

【代码超详解】HDU 2138 How many prime numbers? 有多少个质数?(质数埃筛打表 + 判定,31 ms) 一、题目描述 How many prime numbers Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 27558 Accepted Submission(s): 9246(2019/11/11) Problem Descrip... 阅读详情

10006 - Carmichael Numbers

Time limit: 3.000 seconds

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=947

An important topic nowadays in computer science is cryptography. Some people even think that cryptography is the only important field in computer science, and that life would not matter at all without cryptography. Alvaro is one of such persons, and is designing a set of cryptographic procedures for cooking paella. Some of the cryptographic algorithms he is implementing make use of big prime numbers. However, checking if a big number is prime is not so easy. An exhaustive approach can require the division of the number by all the prime numbers smaller or equal than its square root. For big numbers, the amount of time and storage needed for such operations would certainly ruin the paella.

However, some probabilistic tests exist that offer high confidence at low cost. One of them is the Fermat test.

Let a be a random number between 2 and n - 1 (being n the number whose primality we are testing). Then, n is probably prime if the following equation holds: 

\begin{displaymath}a^n \bmod n = a\end{displaymath}

If a number passes the Fermat test several times then it is prime with a high probability.

Unfortunately, there are bad news. Some numbers that are not prime still pass the Fermat test with every number smaller than themselves. These numbers are called Carmichael numbers.

In this problem you are asked to write a program to test if a given number is a Carmichael number. Hopefully, the teams that fulfill the task will one day be able to taste a delicious portion of encrypted paella. As a side note, we need to mention that, according to Alvaro, the main advantage of encrypted paella over conventional paella is that nobody but you knows what you are eating.

Input 

The input will consist of a series of lines, each containing a small positive number  n (  2 <  n  < 65000). A number  n  = 0 will mark the end of the input, and must not be processed.

Output 

For each number in the input, you have to print if it is a Carmichael number or not, as shown in the sample output.

Sample Input 

1729
17
561
1109
431
0

Sample Output 

The number 1729 is a Carmichael number.
17 is normal.
The number 561 is a Carmichael number.
1109 is normal.
431 is normal.


题意:

判断一个数是否为卡米歇尔数,可用考塞特判别法,参考《数论概论》P80:


思路:

根据考塞特判别法,我们只需要求≤maxn/3的素数,

但由于要越界多判定一个素数的缘故,要保证多求一个素数(在循环中加限制反而会变慢),有两种方法:

方法1. 把N的上限扩大1%,可以保证多求一个素数。

方法2. 通过事先计算求,这里Pn表示第n个素数,。

a)把maxn设为65000打印出c值(见代码),此题为2432;

b)扩大1%倍maxn,比如取maxn=66000;

c)打印出prime[2432]*3,得到65019,即设maxn为65019即可。

PS:上述方法可扩展到求≤f(maxn)的素数的其他题目,比如求≤√maxn的素数等。

筛法复杂度:O(Nlog log N)

考塞特判别法复杂度:


先说结果:小于65000的卡米歇尔数为:

const int CarmichaelNumbers[15] = {561,1105,1729,2465,2821,6601,8911,10585,15841,29341,41041,46657,52633,62745,63973};


完整代码:

/*0.056s*/

#include<cstdio>
const int maxm = 2433;
const int maxn = 65019;

int prime[maxm], c = 0;
bool vis[maxn];

inline void create_prime()
{
	int m = maxn / 3;
	for (int i = 2; i <= m; ++i)
		if (!vis[i])
		{
			prime[c++] = i;
			for (int j = i * i; j < maxn; j += i)
				vis[j] = true;
		}
}

int main()
{
	create_prime();
	//printf("##%d\n",c);
    //printf("##%d\n",prime[2432] * 3);
	int n, maxi;
	while (scanf("%d", &n), n)
	{
		if (vis[n] && n & 1)
		{
			maxi = n / 3;//因为n是奇数
			for (int i = 0; prime[i] <= maxi; ++i)
				if (n % prime[i] == 0)
					if (n % (prime[i] * prime[i]) == 0 || (n - 1) % (prime[i] - 1))
						goto flag;
			printf("The number %d is a Carmichael number.\n", n);
			continue;
		}
flag:
		printf("%d is normal.\n", n);
	}
	return 0;
}



DDR的Controller、Channel、Chip、Rank、Bank、Row、Column、Sided、Dimm DDR的Controller、Channel、Chip、Bank、Rank、Row、Column、Sided、Dimm 阅读详情

相关推荐

三菱FX5U通信之CCLINK操作步骤

11. 连接 CC‐Link 用的端子排,连接 Ver.1.10 对应 CC‐Link 专用电缆。备注:1、以上对应的寄存器都是一一对应的,主站的点数可以比从站多,但是都需要一一对应起来。3.直接安装孔,用于直接安装的螺钉孔(2‐φ4.5,安装螺钉为 M4 螺钉)2.点阵 LED(显示模块中设置的站号和测试模式的内容)5.次段扩展连接器(连接扩展模块的扩展电缆的连接器)4.动作状态(显示 LED 显示模块的动作状态)10 电源连接器,用于连接电源电缆的连接器。1.扩展电缆(扩展时连接用的电缆)

ZXL622722的博客 6929

数论概论读书笔记 19.素性测试与卡米歇尔数

素性测试与卡米歇尔数 素数是整数中优美的一部分,辣怎么判别一个大数是不是素数呢? 费马小定理告诉我们ap≡a&amp;amp;nbsp;(&amp;amp;nbsp;mod&amp;amp;nbsp;p)ap≡a&amp;amp;nbsp;(&amp;amp;nbsp;mod&amp;amp;nbsp;p)a^p\equiv a \ (\ mod \ p) 首先,不满足上式的数,一定不是素数。 但当你尝试了许多aaa之后发现都满足上式,也不能断言ppp就是素数。 对于大部分小的合...

Feynman1999的博客 1922

基于AXI PCIE IP的FPGA PCIE卡示意图

如果在上图中的AXI互联IP上再连接一个带AXI Slave接口的BRAM控制器,这个BRAM控制器连接一个BRAM,Host PC在系统主存中分配了一些不连续的内存,Host PC可以将这些内存段的起始地址(当然要先转为PCIE总线地址)写到AXI总线上的BRAM中,这样AXI CDMA读取BRAM,将读取到的PCIE总线基地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中,这样就实现了SG DMA。通过动态改变AXIBAR2PCIEBAR_n寄存器的值,可以实现多通道DMA。

csdn_gddf102384398的博客 1624

UVa 10006 Carmichael Numbers (快速幂)

给出一个合数 n ,如果对于任意数 a 都有 (2&lt;=a&lt;=n-1) a^n mod n =a ,则称 n 是一个卡迈克尔数. 给出一整数n,判断其是否是卡迈克尔数 如果数 n 本身为质数,即使通过费马测试也不是卡迈尔数 int n,m,t; int i,j,k; ll pow_mod(ll a,ll x,ll mod) { ll ans=1; while(x){ if(x&amp;1) ans=ans*a%mod;...

C_Dreamy的博客 504

408——计算机组成原理(持续更新)

小数点前的0代表正数,1代表负数。

qq_55202378的博客 1722

机械臂速成小指南(八):标准DH法实战——从连杆坐标系到运动学方程

本文详细介绍了机械臂运动学建模中的标准DH法,从连杆坐标系的建立到运动学方程的求解,提供了实用的操作步骤和代码示例。通过DH参数表和变换矩阵的构建,帮助读者快速掌握机械臂运动学建模的核心技术,并解决实际应用中的常见问题。

oo7890的博客 211

UVa 10006 Carmichael Numbers

筛选法产生素数表+快速幂 #include #include #include #define M 65010 bool prime[M]; void make_prime() { int len = sqrt(M+0.5); memset(prime,0,sizeof(prime)); for(int i = 2; i <= len; i++)

zngufeng的专栏 492

【高等数值分析】Krylov子空间方法

文章目录1. 预备理论1.1 Krylov 子空间1.2 最佳逼近1.2.1 方法一:最佳平方逼近1.2.2 方法二:假设 AAA 对称正定1.2.3 方法三:残差2范数2. 基底正交化2.1 Arnoldi 过程(CGS)2.2 改进 Arnoldi 过程(MGS)2.3 Lanczos过程3. 方程组求解3.1 全正交方法 (FOM)3.2 D-Lanczos方法3.3 广义极小残量法(GMRES)3.4 MINRES 方法 1. 预备理论 现在需要求解一个大规模稀疏方程组 Ax=bAx=bAx=b,可

Glooow的博客 1万+

卡米歇尔(Carmichael)数、函数

目录 一,卡米歇尔数 二,Carmichael函数 一,卡米歇尔数 (1)版本一 对于合数m,如果对于所有a,(a,m)=1,都有,则这样的的m称为卡米歇尔数。 或者:对于合数m,如果对于所有a,(a,m)=1,都有,则这样的的m称为卡米歇尔数。 PS:显然这2个表述是等价的 性质:卡米歇尔数都是奇数 (2)版本二 对于合数m,如果对于所有a,都有,则这样的的m称为卡米歇尔数。 PS:版本二的条件包括了版本一的条件,所以版本一的卡米歇尔数集合包括了版本二的,版本一里面的性质对于版本二也

nameofcsdn的博客 4201

如何设计QR反激变换器

摘要:本文分析了基于GaN技术的PD适配器市场现状,重点探讨了准谐振反激变换器(QR Flyback)的工作原理及设计方法。文章首先介绍了反激变换器的三种工作模式(CCM、DCM、CRM/QR)及其特点,指出QR模式通过谷底开通技术能显著降低开关损耗。随后以65W适配器为例,详细阐述了变压器参数设计流程,包括匝比确定、原边电感计算和绕组匝数设计等关键步骤。文章强调QR反激变换器凭借高效率、小体积和低成本优势,已成为20W-65W PD适配器的主流拓扑方案,配合GaN技术进一步提升了功率密度和便携性。

m0_62868254的博客 1496

实战游戏项目管理1-规划篇

1、前言 做研发管理10多年,进游戏行业8年,经验下来项目管理就是一门技术,结合不同行业不同项目加以不同管理方法,但原理基本一样,这里总结下游戏项目的管理一些实操方法 一般游戏确定立项前都需要做,项目预研产出一个游戏Demo,通过公司的立项评审,这个过程的项目管理相对简单一般由制作人或其他项目经理兼任,只有控制好总体时间与成本就好,这里按立项后开始讲。 2、游戏项目规划 ...

pengdali的专栏 2万+

UVA10006 - Carmichael Numbers

当今计算机科学的一个重要的领域就是密码学。有些人甚至认为密码学是计算机科学中唯一重要的领域,没有密码学生命都没有意义。   阿尔瓦罗就是这样的一个人,它正在设计一个为西班牙杂烩菜饭加密的步骤。他在加密算法中应用了一些非常大的素数。然而确认一个非常大的数是不是素数并不是那么简单。一个费时的方法是用比这个数的平方根小的所有素数去除它,对于大整数来说,这样一定会毁掉这个杂烩菜饭的。   然而,一些很...

独钓门前月 537

pycharm下载continue插件接入DeepSeek的API,向其提问输出乱码,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 2220

随机生成密码,卡密

//生成密码 private function getCardPwd($num=0){ $pwd = array(); for($i=0;$i&amp;lt;$num;$i++){ //生成基本随机数 $charid = substr(MD5(uniqid(mt_rand(), true)),8,16).$thi...

round122的博客 3384

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Miller-Rabin概率素数测试算法

本文首先鸣谢以下资料文章: 资料1 资料2 资料3 下面我们开始正文,从源头开始真正的梳理一下素数测试1.素数我们都知道,素数在当今的数论中占有非常重要的地位,主要原因就是素数最根本的性质——除了1,和自身以外,不会被任何一个数整除 并且,素数现在在我们的日常生活中伴有非常重要的地位,这一点的其一主要原因就是素数已经是密码学中最重要的一点,我们当今的密码学常常要涉及到利用超大素数作为我们的

72 73 76 89 82 84 89 81 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

素数判断算法 - 拉宾-米勒测试定理(c++实现)

 //========================================================在1000如此小的素数判断,在不考虑效率的情况下可以利用素数的定义来判断printf("2 ");//2是唯一一个偶素数 for( int a = 3; a <= 1000; a+=2) //步进为2, 因为只有奇数才有可能是素数(已排除了2) { bool b

熊晓杰 -- (暴熊 || kongbu0621 || kongbu0622) 的专栏 4263

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数论概论 定理总结

数论概论 勾股数组 勾股数组与单位圆 扩展欧几里得 gcd

numberer的博客 722

密码学---公钥密码---数学知识

密码学中常用的数学知识1.群、环、域半群群群的种类群的阶数实例环实例域域的分类实例2.素数、互素数3.模运算4.模指数运算5.费尔马定理、欧拉定理、卡米歇尔定理6.素性检验 1.群、环、域 群、环、域都是代数系统(代数结构)。代数系统包括数学对象的集合以及在集合上采用的关系或运算(可以是单元运算、也可以是多元运算) 常用集合: Q:有理数集合 I:整数集合 Z:正整数集合 R:实数集合 C:复数集合 Zn:Zn={0,1,2,3,…,n-1} Mn:I上的n*n方阵 R(x):R(x)是所有实系数的多项式

sfakh的博客 3274

uva10006 Carmichael Numbers(卡迈克尔数+素数打表)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&page=show_problem&problem=947 题意:判断一个数是否是卡迈克尔数。 这题做的我真是峰回路转啊。。 首先本来是想看着《挑战》复习下快速幂,结果这题根本用不到。 刚开始看到x^n≡x(

Iguodala的博客 3451

素性检测

如何判断一个数是素数还是合数? 最简单的方法 从1−n√挨个除 n,如果能有一个能整除 n,则n不是素数,负责n是素数 缺点 如果n特别大,那么这种方法就非常耗时间且不容易实现 1 利用费马小定理判断 如果 p是素数 则 ap−1=1(modm), 任意从1 ...

weixin_30809333的博客 257

米勒-拉宾素数测试

由于卡米歇尔数的存在,导致 费马小定理 无法判断一个数是否是素数。 费马小定理: 设p是素数, a是任意整数且 a!三0( mod p ), 则                      a^(p-1)  三  1(mod p)  //======================================================== 卡米歇尔数:它是合数, 当

SprintfWater的专栏 7291

【密码学】5. 公钥密码

本章系统梳理了公钥密码学的数学基础与核心算法。主要内容包括:1)数学基础:群、环、域等代数结构,素数与模运算,费马定理、欧拉定理等数论知识;2)关键算法:RSA算法的原理与实现(密钥生成、加解密、优化方法),背包密码体制的构建;3)计算复杂性理论:时间复杂度分类、困难问题假设;4)安全考量:各类算法的潜在攻击方式与防护措施。本章特别强调离散对数、大整数分解等困难问题在公钥密码中的核心地位,以及如何基于这些数学难题构建安全密码体制。通过理论推导与实例分析,系统阐述了公钥密码的设计原理与实现方法。

m0_72516377的博客 1032

UVA 题目分类 (10000–10099)

10000  Longest Paths 最短路径   最短路径的变形,应用bellmanford算法 10001  Garden of Eden 搜索题目  直接搜索,Hash判重 10002  Center of Masses 重心计算  公式 10003  Cutting Sticks 动态规划  有些类似矩阵规划 10004  Bicoloring 并查集题  经典

iCpC之旅 1460

UVa 10006 - Carmichael Numbers

题目:判断一个数是不是Carmichael number。 分析:数论。利用素数的随进判定算法,可以通过判定并且不是素数的数称为Carmichael number。             首先,利用筛法对素数进行打表。             然后,利用费马小定理枚举所有的a进行判断。 #include #include #include using namespace st

小白菜又菜 2702

UVA 10006_Carmichael number

题意: N 为合数,对于任意一个在(1,N)之间的数满足 anmodn=a,则称N为Carmichael number,对于给定的N,判断是否为Carmichael number。 分析: 素数区间筛法+快速幂 代码: #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;iostrea...

An55511的博客 234
上一篇: UVa 106/POJ 1305 Fermat vs. Pythagoras(数论&勾股数)
下一篇: UVa 100 / HDU 1032 / POJ 1207 The 3n + 1 problem (数论&Collatz序列周期)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值