题意:

欧拉发现了这个著名的二次多项式:

f(n) = n2 + n + 41

对于连续的整数n从0到39,这个二次多项式生成了40个素数。然而,当n = 40时402 + 40 + 41 = 40(40 + 1) + 41能够被41整除,同时显然当n = 41时,412 + 41 + 41也能被41整除。

随后,另一个神奇的多项式n2 − 79n + 1601被发现了,对于连续的整数n从0到79,它生成了80个素数。这个多项式的系数-79和1601的乘积为-126479。

考虑以下形式的二次多项式:

  • n2 + an + b, 满足|a| < 1000且|b| < 1000

  • 其中|n|指n的模或绝对值
    例如|11| = 11以及|−4| = 4

这其中存在某个二次多项式能够对从0开始尽可能多的连续整数n都生成素数,求其系数a和b的乘积。

思路:根据上面的式子 f(n) 可以进行推导几个性质:

  1. 当 n = 0 时 f(0) = b ,因为f(n)是素数所以 b 一定是素数
  2. 当 n = 1 时 f(1) = a + b + 1,因为f(n) > 0 所以 a > -b - 1
  3. 当 gcd(a , b) = d 且 d != 1时,一定会枚举到一个数 n' = minP(d) (代表d的最小素因数) 使得 f(n') 为合数,即当 a , b 不互质时,最多生成 minP(d) 个连续的素数。

根据这三条性质就可以优化代码,降低程序运行时间。

这个题中米勒测试没有增加二次探测,所以判断素数还是有几率出错的,虽然这个几率小的惊人,但万一非洲人呢 : )


/*************************************************************************
> File Name: euler027.c
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年06月30日 星期五 20时42分40秒
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <inttypes.h> #define MAX_ROUND 30
#define MAX_N 1000 int32_t prime[MAX_N + 10] = {0};
int32_t primeList[MAX_N + 10] = {0}; void Init() {
prime[1] = 1;
for (int32_t i = 2 ; i <= MAX_N ; i++) {
if (!prime[i]) {
prime[i] = i;
primeList[ ++primeList[0] ] = i;
}
for (int32_t j = 1 ; j <= primeList[0] ; j++) {
if (i * primeList[j] > MAX_N) break;
prime[i * primeList[j]] = primeList[j];
if (i % primeList[j] == 0) break;
}
}
} int32_t quick_power(int32_t a , int32_t b , int32_t mod) {
int32_t ret = 1;
while(b) {
if (b & 1) ret = ret * a % mod;
a = a * a % mod;
b >>= 1;
}
return ret % mod;
}
bool R_M_TEST(int32_t x) {
if (x <= 1) return false;
srand(time(NULL));
for (int32_t i = 0 ; i < MAX_ROUND ; i++) {
int32_t a = (rand()) % (x - 1) + 1;
if (quick_power(a , x - 1 , x) != 1) return false;
}
return true;
} int32_t HowManyPrime(int32_t a , int32_t b) {
int32_t i = 0;
while (R_M_TEST(i * i + a * i + b)) i++;
return i;
} int32_t gcd(int32_t a , int32_t b) {
return b == 0 ? a : gcd(b , a % b);
} int32_t main() {
int32_t a , b , d , maxQuadraticPrime = 0 , ans , manyPrime;
Init();
for (int32_t i = 1 ; i <= primeList[0] ; i++) {
b = primeList[i];
for (a = -b - 1 ; a < MAX_N ; a++) {
if (prime[a + b + 1] != a + b + 1) continue;
d = gcd(a , b);
manyPrime = HowManyPrime(a , b);
if (d != 1 && maxQuadraticPrime >= prime[d]) continue;
if (maxQuadraticPrime < manyPrime) {
maxQuadraticPrime = manyPrime;
ans = a * b;
}
}
}
printf("ans = %d\n",ans);
return 0;
}

Project Euler 27 Quadratic primes( 米勒测试 + 推导性质 )的更多相关文章

  1. Project Euler 21 Distinct primes factors( 整数因子和 )

    题意: 记d(n)为n的所有真因数(小于n且整除n的正整数)之和. 如果d(a) = b且d(b) = a,且a ≠ b,那么a和b构成一个亲和数对,a和b被称为亲和数. 例如,220的真因数包括1. ...

  2. Project Euler 47 Distinct primes factors( 筛法记录不同素因子个数 )

    题意: 首次出现连续两个数均有两个不同的质因数是在: 14 = 2 × 715 = 3 × 5 首次出现连续三个数均有三个不同的质因数是在: 644 = 22 × 7 × 23645 = 3 × 5 ...

  3. Project Euler 37 Truncatable primes

    题意:3797有着奇特的性质.不仅它本身是一个素数,而且如果从左往右逐一截去数字,剩下的仍然都是素数:3797.797.97和7:同样地,如果从右往左逐一截去数字,剩下的也依然都是素数:3797.37 ...

  4. Project Euler 35 Circular primes

    题意:197被称为圆周素数,因为将它逐位旋转所得到的数:197/971和719都是素数.小于100的圆周素数有十三个:2.3.5.7.11.13.17.31.37.71.73.79和97.小于一百万的 ...

  5. Project Euler 58: Spiral primes

    从一开始按以下方式逆时针旋转,可以形成一个边长为七的正方形螺旋: 一个有趣的现象是右下对角线上都有一个奇完全平方数,但是更有趣的是两条对角线上的十三个数中有八个数是素数(已经标红),也就是说素数占比为 ...

  6. Project Euler 41 Pandigital prime( 米勒测试 + 生成全排列 )

    题意:如果一个n位数恰好使用了1至n每个数字各一次,我们就称其为全数字的.例如,2143就是一个4位全数字数,同时它恰好也是一个素数. 最大的全数字的素数是多少? 思路: 最大全排列素数可以从 n = ...

  7. Python练习题 047:Project Euler 020:阶乘结果各数字之和

    本题来自 Project Euler 第20题:https://projecteuler.net/problem=20 ''' Project Euler: Problem 20: Factorial ...

  8. Python练习题 039:Project Euler 011:网格中4个数字的最大乘积

    本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...

  9. Python练习题 038:Project Euler 010:两百万以内所有素数之和

    本题来自 Project Euler 第10题:https://projecteuler.net/problem=10 # Project Euler: Problem 10: Summation o ...

随机推荐

  1. CentOS 6.9使用sudo时出现:“...不在 sudoers 文件中,此事将被报告”的问题解决

    在终端切换root账号登录 su 修改/etc/sudoers文件 visudo 找到:root ALL=(ALL) ALL,修改成自己的账号: 保存即可,按Exc,输入”:wq!“,回车.

  2. POJ 1985

    求一棵树内最远的两点,DFS,顺便记录以某节点为根内最远的两点的距离,返回最远点的距离.其实是DP. #include <cstdio> #include <iostream> ...

  3. 万众创业,互联网+,WTO

    WTO的保护期,发展的非常繁荣.但大部分的资源都配置在了房地产这个支柱产业, 而被保护的行业小日子过得不错, 研发再投入?那是傻子才做的事情,别墅.豪车.美女.这才是生活. 但突然有一天,发现保护期要 ...

  4. 【STL容器学习】-关联容器与map的用法

    STL提供了4个关联容器:set.multiset.map和multimap.这些容器提供了通过keyword高速存储和訪问数据元素的能力.Set和map不同意有反复keyword,而multiset ...

  5. Tomcat启动时载入某个servlet

    当我们做一个java项目时,有几个功能都须要载入servlet或者实现某个共同的方法,尽管我们一味地在每个功能中依次载入也不是不能够,可是当某个servlet 或者方法被频繁地载入和应用.我们将面向对 ...

  6. Unity3D与JSP TomCatserver传递数据和文件( 二 ) Unity3D向java传输表单

    扫码关注微信公众号,获取最新资源 经历了一天的工作.我又来更新啦...白天手欠,把上一个给删了.明天重写吧.. 废话不多说.我们先去Unity里创建一个能够输入username和password的登录 ...

  7. wpf Listbox 设置ItemContainerStyle后,ItemTemplateSelector不能触发

    解决方案: 将Listbox 的ItemTemplateSelector 改为 ItemContainerStyle中ContentPresenter ContentTemplateSelector ...

  8. Linux开发环境搭建与使用——Linux必备软件之Samba

    假如我们是在ubuntu环境上做对应的开发.有的时候,我们须要把我们写的程序共享给别人,或者,自己拷贝出来备份一份.我们习惯用U盘拷贝,假设须要频繁拷贝的话,这样会不太方便.这里给大家介绍一种更好的方 ...

  9. luogu1347 排序

    题目大意 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列.给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序(能,矛盾,不确定).确定n个元素的顺序后 ...

  10. ES 断路器——本质上保护OOM提前抛出异常而已

    监控fielddata使用了多少内存以及是否有数据被驱逐是非常重要的.大量的数据被驱逐会导致严重的资源问题以及不好的性能. Fielddata使用可以通过下面的方式来监控: 对于单个索引使用 {ref ...