鱼C论坛

 找回密码
 立即注册
查看: 3417|回复: 13

题目46:最小的不能写作一个质数与一个平方数的二倍之和的奇合数是多少?

[复制链接]
发表于 2015-5-16 23:28:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Goldbach's other conjecture

It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square.

BaiduShurufa_2015-5-16_23-27-44.png

It turns out that the conjecture was false.

What is the smallest odd composite that cannot be written as the sum of a prime and twice a square?

题目:

Christian Goldbach 提出每个奇合数都可以写作一个质数与一个平方数的二倍之和:

BaiduShurufa_2015-5-16_23-27-44.png

但是这个推测是错误的。

最小的不能写作一个质数与一个平方数的二倍之和的奇合数是多少?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-9-23 14:40:23 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-9-23 14:43 编辑
  1. 5777
  2. [Finished in 18.9s]

  3. def isPrime(num):
  4.         flag = 1
  5.         for i in range(3,int(num**0.5+1),2):
  6.                 if num % i == 0:
  7.                         flag = 0
  8.         return flag

  9. hlst = []
  10. plst = [2,3,5,7,11,13,17,19,23,29,31]
  11. for num in range(33, 1000000,2):
  12.         if isPrime(num) == 1:
  13.                 plst.append(num)
  14.         else:
  15.                 hlst.append(num)
  16.                 for each in plst:
  17.                         test = ((num - each) * 0.5)**0.5
  18.                         if test not in range(1000):
  19.                                 flags = 0
  20.                         else:
  21.                                 flags = 1
  22.                                 break
  23.                 if flags == 0:
  24.                         print (num)
  25.                         exit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-29 18:22:00 | 显示全部楼层
  1. def isPrime(n):
  2.     if n <= 1: return False
  3.     if n == 2: return True
  4.     if n % 2 == 0: return False
  5.     for i in range(3,int(n**0.5)+1,2):
  6.         if n % i == 0: return False
  7.     return True
  8. for i in range(3,10000,2):
  9.     m = 0
  10.     if not isPrime(i):
  11.         for j in range(1,int((i//2)**0.5)+1):
  12.             if isPrime(i - j**2*2):
  13.                     m = 1
  14.         if m == 0:
  15.             print(i)
  16.             break
复制代码

答案:5777
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-17 22:34:42 | 显示全部楼层
  1. import math
  2. def Jh(x):
  3.     if x>1 and x%2==1:
  4.         for i in range(3,int(math.sqrt(x)+1),2):
  5.             if not x%i:
  6.                 return True
  7.         return False

  8. def Prime(x):
  9.     if x>1:
  10.         if x==2:
  11.             return True
  12.         if x%2==0:
  13.             return False
  14.         for i in range(3,int(math.sqrt(x)+1),2):
  15.             if x%i==0:
  16.                 return False
  17.         return True
  18.     return False
  19. i = 9
  20. while True:
  21.     if Jh(i):
  22.         tmp = True
  23.         for j in range(2,i):
  24.             if Prime(j):
  25.                 if math.sqrt((i-j)/2)==int(math.sqrt((i-j)/2)):
  26.                     tmp = False
  27.                     break
  28.         if tmp:
  29.             print(i)
  30.             break
  31.     i+=1
复制代码

答案:5777
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-16 11:00:50 | 显示全部楼层
  1. # encoding:utf-8
  2. # 找出最小的不能写作一个质数与一个平方数的二倍之和的奇合数
  3. from time import time
  4. from math import sqrt
  5. def getPrimes(N):
  6.     primes = [True] * N
  7.     primes[0], primes[1] = False, False
  8.     for i, prime in enumerate(primes):
  9.         if prime:
  10.             for j in range(i * i, N, i):
  11.                 primes[j] = False
  12.     return [k for k, p in enumerate(primes) if p]
  13. def euler045(N=10000):
  14.     s_primes = set(getPrimes(N))
  15.     l_nums = [t for t in (set([x for x in range(2, N)]) - s_primes) if t % 2]
  16.     for each in l_nums:
  17.         flag = False
  18.         for k in range(1, int(sqrt(each / 2)) + 1):
  19.             t = each - 2 * k ** 2
  20.             if t in s_primes:
  21.                 flag = True
  22.                 break
  23.         if not flag:
  24.             print(each)
  25.             return
  26. if __name__ == '__main__':
  27.     start = time()
  28.     euler045()
  29.     print('cost %.6f sec' % (time() - start))
复制代码

5777
cost 0.015001 sec
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-13 12:44:24 | 显示全部楼层
本帖最后由 渡风 于 2017-6-13 12:45 编辑

此代码使用matlab编程
Problem46所用时间为1.052秒
Problem46的答案为5777
  1. %% Problem46.m
  2. %最后编辑时间:2017-06-13 11:00 版本1.0
  3. %找出第一个奇合数,使得其不能被一个质数和一个数平方的两倍的和表示

  4. % Problem46所用时间为1.052秒
  5. % Problem46的答案为5777

  6. function Output = Problem46()
  7. tic
  8. Start = 35;
  9. Judge = 1;
  10. while (Judge == 1)
  11.     Start = Start + 2;
  12.     Judge =  P64(Start);
  13. end

  14. Output = Start;
  15. toc

  16. disp('此代码使用matlab编程')
  17. disp(['Problem46所用时间为',num2str(toc),'秒'])
  18. disp(['Problem46的答案为',num2str(Output)])
  19. end
  20. % 输入一个奇合数,判断其能不能被一个质数和令一个数平方的和;
  21. function Judge = P64(n)
  22. if nargin == 0
  23.     n = 31;
  24. end
  25. Judge = 0;
  26. if isprime(n) == 1
  27.     Judge = 1;
  28. else
  29.     for ii = 3 : 2 : n-2
  30.         if sqrt((n - ii)/2 ) ==  floor(sqrt((n - ii)/2 ))
  31.             if  isprime(ii) == 1
  32.                 Judge = 1;
  33.                 break
  34.             end
  35.         end
  36.     end
  37. end
  38. end
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-30 10:58:02 | 显示全部楼层
用的matlab
结果是:
        5777

时间已过 5.816219 秒。
>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-30 00:27:20 | 显示全部楼层
  1. def isOddCompNum(num):
  2.     for i in range(3, int(num**0.5+1)):
  3.         if num % i == 0:
  4.             return True
  5.     else:
  6.         return False

  7. def isPrime(num):
  8.     if num <= 1:
  9.         return False
  10.     else:
  11.         for i in range(2, int(num**0.5+1)):
  12.             if num % i == 0:
  13.                 return False
  14.         else:
  15.             return True

  16. def PrimeList(num):
  17.     PrimeTempList = []
  18.     for i in range(3, num+1):
  19.         if isPrime(i):
  20.             PrimeTempList.append(i)
  21.     return PrimeTempList

  22. for i in range(35, 6000, 2):
  23.     if isOddCompNum(i):
  24.         PrimeNumTempList = PrimeList(i)
  25.         for each in PrimeNumTempList:
  26.             if ((i-each)//2)**0.5 in range(int(((i-each)//2)**0.5+1)):
  27.                 break
  28.         else:
  29.             print(i)
  30.             break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-24 09:00:16 | 显示全部楼层
本帖最后由 王小召 于 2019-6-24 09:02 编辑

最小的不能写作一个质数与一个平方数的二倍之和的奇合数是:5777
用时:0.3276021 秒
  1. import time


  2. def prime(num_range):
  3.     bool_num = [1] * (num_range + 1)
  4.     bool_num[0], bool_num[1] = 0, 0
  5.     for i, j in enumerate(bool_num):
  6.         if j:
  7.             for x in range(i**2, num_range, i):
  8.                 bool_num[x] = 0
  9.     return bool_num


  10. def cal_result():
  11.     p_list = prime(100000)
  12.     start = 5
  13.     while True:
  14.         if not p_list[start]:
  15.             mark = 0
  16.             for z in range(2, start):
  17.                 if p_list[z] and ((start - z)/2)**0.5 == int(((start - z)/2)**0.5):
  18.                     mark = 1
  19.                     break
  20.             if not mark:
  21.                 return start
  22.         start += 2

  23. print("最小的不能写作一个质数与一个平方数的二倍之和的奇合数是:{}"
  24.       "\n用时:{} 秒".format(cal_result(), time.process_time()))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-5 18:59:59 | 显示全部楼层
  1. from time import process_time as t
  2. t1=t()
  3. def maker(end,choose=True):
  4.   primelist=[True]*(end+1)
  5.   primelist[0],primelist[1]=None,False
  6.   for i,prime in enumerate(primelist[:int(end/2+1)]):
  7.     if prime:
  8.       for j in range(2*i,end+1,i):primelist[j]=False
  9.   return [i for i,prime in enumerate(primelist) if prime]if choose else [i for i,prime in enumerate(primelist) if not prime and i%2!=0][1:]
  10. pl=maker(10000)
  11. for i in maker(10000,0):
  12.   flag=True
  13.   for j in pl:
  14.     if j>i:break
  15.     if ((i-j)/2)**0.5%1==0:
  16.       flag=False
  17.       break
  18.   if flag:break
  19. print(f'运行结果:{i}\n运行时间:{t()-t1}s')
复制代码
运行结果:5777
运行时间:0.078125s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 10:04:46 | 显示全部楼层
5777

Process returned 0 (0x0)   execution time : 0.043 s
Press any key to continue.
对于各个奇合数,枚举平方数,判断奇合数与平方数二倍之差是否为质数即可
  1. #include<iostream>
  2. using namespace std;

  3. const int M = 1e6;
  4. int cnt = 0;
  5. bool prime[M];
  6. int factor[M];

  7. void euler_sieve(){
  8.   prime[1] = false;
  9.   for (int i = 2;i <= M;i++) prime[i] = true;

  10.   for (int i = 2;i <= M;i++){
  11.     if (prime[i]) factor[++cnt] = i;
  12.     for (int j = 1;j <= cnt && i*factor[j] < M;j++){
  13.       prime[i*factor[j]] = false;
  14.       if (i % factor[j] == 0) break;
  15.     }
  16.   }
  17. }

  18. bool judge(int x){
  19.   int t;

  20.   for (int i = 1;(t = x - 2*i*i) > 1;i++){
  21.     if (prime[t]) return false;
  22.   }

  23.   return true;
  24. }

  25. int main(){
  26.   euler_sieve();

  27.   for (int i = 35; ;i+=2){
  28.     if (prime[i]) continue;
  29.     if (judge(i)) {cout << i << endl; break;}
  30.   }

  31.   return 0;
  32. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 21:53:59 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int check_prime(int);
  4. int check_prime(int num)
  5. {
  6.         if (num == 2)
  7.         {
  8.                 return 1;
  9.         }
  10.         if (num == 1)
  11.         {
  12.                 return 0;
  13.         }
  14.         int i, j;
  15.         j = sqrt(num);
  16.         for (i = 2; i <= j; i++)
  17.         {
  18.                 if (num % i == 0)
  19.                 {
  20.                         return 0;
  21.                 }
  22.         }
  23.         return 1;
  24. }

  25. main()
  26. {
  27.         int i = 33, j, k, m, n, flag = 1;

  28.         while (1)
  29.         {
  30.                 i += 2;
  31.                 if (check_prime(i))
  32.                 {
  33.                         continue;
  34.                 }
  35.                 for (j = i - 2; j > 2; j -= 2)
  36.                 {
  37.                         if (check_prime(j))
  38.                         {
  39.                                 k = i - j;
  40.                                 if (k % 2)
  41.                                 {
  42.                                         continue;
  43.                                 }
  44.                                 else
  45.                                 {
  46.                                         k /= 2;
  47.                                         n = sqrt(k);
  48.                                         m = n * n;
  49.                                         if (m == k)
  50.                                         {
  51.                                                 flag = 0;
  52.                                                 break;
  53.                                         }
  54.                                 }
  55.                         }
  56.                 }
  57.                 if (flag)
  58.                 {
  59.                         printf("%d\n", i);
  60.                         break;
  61.                 }
  62.                 flag = 1;
  63.         }
  64.        
  65. }
复制代码


5777
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-22 15:58:56 | 显示全部楼层
#最小的不能写作一个质数与一个平方数的二倍之和的奇合数是多少
from time import *
from math import *
#判断质数
def is_prime(number):
    if number > 1:
        if number == 2:
            return True
        if number % 2 == 0:
            return False
        for a in range(3,int(sqrt(number) + 1),2):
            if number % a == 0:
                return False
        return True
    return False

#生成质数列表
def prime(number):
    prime = []
    for each in range(2, number):
        if is_prime(each):
            prime.append(each)
    return prime

#判断奇数
def is_odd(number):
    if number > 1:
        if number % 2 != 0:
            return True

#判断是否有解
def is_True(number):
    for each in prime(number):
        n = sqrt((number - each)/2)
        if n == int(n):
            return True
    return False
        
        
#奇合数生成器
def get_number(number):
    while True:
        if is_odd(number) and not is_prime(number):
            yield number
        number += 1

s = time()
for each in get_number(1):
    if not is_True(each):
        print(each)
        break
e = time()
print("用时%.4f秒" % (e-s))
#'''   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-24 22:58:33 | 显示全部楼层
  1. import time as t
  2. import math

  3. start = t.perf_counter()


  4. def check_prime(a_num):
  5.     is_prime = True
  6.     for i in range(2, int(math.sqrt(a_num) + 1)):
  7.         if a_num % i == 0:
  8.             is_prime = False
  9.     return is_prime


  10. def is_integer(a_num):
  11.     delta = 0.00001
  12.     if abs(a_num - int(a_num)) < delta:
  13.         return True


  14. primes = [2, 3]
  15. odd_num = 3
  16. while True:
  17.     odd_num += 2
  18.     speculation = True
  19.     if not check_prime(odd_num):
  20.         speculation = False
  21.         for prime in primes:
  22.             if is_integer(math.sqrt((odd_num - prime) / 2)):
  23.                 speculation = True
  24.     else:
  25.         primes.append(odd_num)
  26.     if not speculation:
  27.         break

  28. print(odd_num)
  29. print("It costs %f s" % (t.perf_counter() - start))
复制代码



5777
It costs 0.345528 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表