对称素数c语言

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

对称素数 C语言
对称素数是一种特殊的素数,它的十进制表示在任意位置切割后,左右两边的数字都是素数。

例如,7331 是一个对称素数,因为 7、73、733、7331、331、31、3 都是素数。

对称素数也可以看作是回文素数的推广,回文素数是指从左到右和从右到左读都一样的素数,例如 131。

对称素数的性质和分布规律一直是数论研究的一个重要课题,本文将介绍一些关于对称素数的基本概念和性质,以及如何用 C 语言编写程序来寻找对称素数。

对称素数的定义和性质
对称素数的定义如下:
设 p 是一个大于 10 的正整数,如果 p 的十进制表示为a1a2⋯a n,其中a i是 0 到 9 之间的数字,且对任意的1≤k≤n,都有a1a2⋯a k和a k+1a k+2⋯a n都是素数,则称 p 是一个对称素数。

例如,113 是一个对称素数,因为 1、11、113、13、3 都是素数。

注意,对称素数的定义要求大于 10 的正整数,这是为了排除单个数字的情况,因为单个数字不符合切割的条件。

对称素数有以下几个性质:
对称素数一定是奇数,因为如果是偶数,则最后一位是偶数,切割后右边的数字也是偶数,不可能是素数。

对称素数不能以 5 结尾,因为如果以 5 结尾,则切割后右边的数字也以 5 结尾,除了 5 以外,其他以 5 结尾的数字都不是素数。

对称素数的位数不能是 4 的倍数,因为如果是 4 的倍数,则可以将其分成两个相同位数的数字,例如 7331 可以分成 73 和 31,这两个数字的位数之和就是原来数字的位数。

但是根据恒等式10n+1=3×(3×10n−1+1),可以证明任意两个相同位数且互质的数字之和都能被 3 整除,所以这样切割后左边的数字一定能被 3 整除,不可能是素数。

对称素数不能有连续相同的数字,因为如果有连续相同的数字,则切割在这些数字之间时,左边或右边的数字就会有前导零或后缀零,例如 73331 切割在两个 3 之间时,左边的数字是 73,右边的数字是 031,这样就不符合对称素数的定义。

对称素数的分布和数量
目前已知最小的对称素数是 11,最大的已知对称素数是104989+941992101×(102495−1)+1,它有 4990 位。

已知共有 55 个对称素数(截至2023年6月),它们分别是:
11,101,181,1181,18181,108881,110881,118081,120121,121021,
121151,150151,151051,151121,180181,180811,181081,188011,300131,
301031,301051,310051,311111,320021,321121,321181,351151,400151,
401041,401141,410041,411101,411111,411181,420211,421121,500021,
500111,501011,501121,510121,511031,511151,600061,601061,
611111,621221,800081,801091,801101
对称素数的分布非常稀疏,随着位数的增加,对称素数的数量呈现出指数下降的趋势。

根据对称素数的性质,可以估计对称素数的数量和分布如下:
对于 n 位的对称素数,n 不能是 4 的倍数,且首位和末位不能是偶数或 5,所以首位和末位的选择有 16 种可能,中间的 n-2 位的选择有10n−2种可能,所以 n 位数字的总数是16×10n−2。

对于任意一个 n 位数字,如果它是对称素数,则它必须满足 n-1 个条件,即每次切割后左右两边都是素数。

根据素数定理,对于一个小于 x 的正整数,它是素数的概率大约是1/ln x,所以一个 n 位数字是对称素数的概率大约是(1/ln10)n−1。

根据以上两点,可以估计 n 位对称素数的数量大约是16×10n−2×(1/ln10)n−1=1.6×(10/ln10)n−3。

这个公式只是一个粗略的估计,实际上对称素数的数量可能比这个公式给出的结果更少,因为这个公式没有考虑对称素数的其他性质,例如不能有连续相同的数字等。

对称素数的寻找方法
寻找对称素数的一种简单方法是遍历所有可能的数字,并检查它们是否满足对称素数的定义。

为了提高效率,可以根据对称素数的性质进行一些剪枝,例如只考虑奇数、不以 5 结尾、位数不是 4 的倍数、没有连续相同的数字等。

另外,为了判断一个数字是否是素数,可以使用一些快速的素性测试算法,例如米勒-拉宾算法、索洛韦-斯特拉森算法等。

下面给出一个用 C 语言编写的程序,用来寻找小于等于给定上限的所有对称素数。

程序使用了米勒-拉宾算法来判断素性,并使用了一些剪枝技巧来加速搜索。

程序输出了小于等于109的所有对称素数,并统计了运行时间。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
// 判断一个正整数是否是素数,使用米勒-拉宾算法
int is_prime(unsigned int n) {
if (n <2) return0; // 小于2的不是素数
if (n ==2|| n ==3) return1; // 2和3是素数
if (n %2==0) return0; // 偶数不是素数
unsigned int d = n -1; // 将n-1分解成d*2^r的形式
int r =0;
while (d %2==0) {
d /=2;
r++;
}
// 使用5个基础测试值
int bases[5] = {2,3,5,7,11}; // 用于测试的基数
for (int i =0; i <5; i++) {
int a = bases[i]; // 取一个基数
if (a >= n) break; // 如果基数大于等于n,跳出循环
unsigned int x =1; // 计算x=a^d mod n
unsigned int y = a;
unsigned int z = d;
while (z >0) {
if (z %2==1) x = (unsigned long long)x * y % n;
y = (unsigned long long)y * y % n;
z /=2;
}
if (x ==1|| x == n -1) continue; // 如果x=1或n-1,通过测试
int flag =0; // 标记是否通过测试
for (int j =0; j < r -1; j++) {
x = (unsigned long long)x * x % n; // 计算x=x^2 mod n
if (x == n -1) { // 如果x=n-1,通过测试
flag =1;
break;
}
if (x ==1) return0; // 如果x=1,不是素数
}
if (flag ==0) return0; // 如果没有通过测试,不是素数
}
return1; // 如果通过所有测试,是素数
}
// 判断一个正整数是否是对称素数,即切割后左右两边都是素数
int is_symmetric_prime(unsigned int n) {
if (!is_prime(n)) return0; // 如果n不是素数,直接返回0
unsigned int m = n /10; // 去掉最后一位数字
unsigned int p =10; // 记录当前的位数
while (m >0) {
if (!is_prime(m)) return0; // 如果左边不是素数,返回0
if (!is_prime(n % p)) return0; // 如果右边不是素数,返回0
m /=10; // 继续去掉最后一位数字
p *=10; // 增加一位数字
}
return1; // 如果都是素数,返回1
}
// 寻找小于等于给定上限的所有对称素数,并输出到屏幕上
void find_symmetric_primes(unsigned int limit) {
printf("The symmetric primes less than or equal to %u are:\n", limit);
int count =0; // 记录对称素数的个数
for (unsigned int n =11; n <= limit; n +=2) { // 遍历所有奇数
if (n %5==0) continue; // 跳过以5结尾的数字
int digits =floor(log10(n)) +1; // 计算数字的位数
if (digits %4==0) continue; // 跳过位数是4的倍数的数字
int last_digit = n %10; // 记录最后一位数字
int repeat = last_digit + last_digit *10+ last_digit *100+ last_digit *1000; // 计算连续四个相同数字的值
if (n % repeat ==0) continue; // 跳过有连续四个相同数字的值的数字
if (is_symmetric_prime(n)) { // 判断是否是对称素数
printf("%u ", n); // 输出对称素数
count++; // 增加对称素数的个数
}
}
printf("\nThere are %d symmetric primes less than or equal to %u.\n", count, limit); // 输出对称素数的总数
}
// 主函数,测试寻找对称素数的程序
int main() {
clock_t start, end; // 记录程序运行时间的变量
start =clock(); // 开始计时
find_symmetric_primes(1000000000); // 寻找小于等于10亿的所有对称素数
end =clock(); // 结束计时
double time = (double)(end - start) / CLOCKS_PER_SEC; // 计算程序运行时间
printf("The program runs in %.2f seconds.\n", time); // 输出程序运行时间
return0;
}
对称素数的应用和意义
对称素数是一种具有美感和对称性的素数,它们可以用来构造一些有趣的数学问题和游戏,例如:给定一个对称素数,求它的下一个对称素数是多少?
给定一个数字,判断它是否是对称素数,如果不是,求它最近的对称素数是多少?
给定一个位数,求这个位数的所有对称素数有多少个?
给定一个范围,求这个范围内的所有对称素数有多少个?
对称素数也可以用来设计一些密码学的算法和协议,例如:
使用对称素数作为密钥或者密钥的一部分,增加破解的难度。

使用对称素数作为身份认证或者数字签名的依据,提高安全性和可信度。

使用对称素数作为随机数生成器的种子或者参数,提高随机性和不可预测性。

对称素数还可以用来探索一些深刻的数学问题和猜想,例如:
对称素数是否有无穷多个?如果有,它们的分布规律是什么?
对称素数是否存在某种规律或者公式,可以直接生成或者判断对称素数?
对称素数是否和其他类型的特殊素数有某种联系或者相互影响?
总结
本文介绍了对称素数的概念、性质、分布、寻找方法、应用和意义。

对称素数是一种既简单又复杂的素数,它们展示了数字世界中的美丽和神秘。

通过研究和探索对称素数,我们可以提高我们的逻辑思维和编程能力,也可以欣赏到数学的魅力和趣味。

希望本文能够激发你对对称素数的兴趣和好奇心,也欢迎你分享你关于对称素数的发现和想法。

相关文档
最新文档