鱼C论坛

 找回密码
 立即注册
查看: 3567|回复: 8

[技术交流] 小练习:20171030 生成素数的整数

[复制链接]
发表于 2017-10-29 18:52:43 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2017-11-12 19:13 编辑

从现在开始我们要开展一批欧拉计划的习题练习。

其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。

什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html

我们欧拉板块现已给出了200余题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。

如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives

这里已经有了500余题。


                               
登录/注册后可看大图


要求:

以python语言完成,如果是python2请注明。

程序以代码文字格式发帖。

注重程序效率和创意。

答题在一周内完成,即10.30 10:00之前,其后将公开大家的答案,并评比成绩。

另程序和答案可以在网上搜到,希望大家独立完成。题目不难,大家看看谁的效率高。

-- 回帖需写明解题思路,鼓励在程序中加上注释 --

-- 一些鱼油反映题目有些过难,为此略过一部分偏难的题目 --


                               
登录/注册后可看大图
357

考虑30的约数:1、2、3、5、6、10、15、30。
可以看出,对于30的每个约数d,d+30/d都是素数。
即:
1+30/1=31
2+30/2=17
3+30/3=13
5+30/5=11
6+30/6=11
10+30/10=13
15+30/15=17
30+30/30=31
都是素数。
存在不超过100 000 000的正整数n,使得对于n的每个约数d,d+n/d都是素数;求所有这样的数n的和。

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

使用道具 举报

发表于 2017-10-29 21:43:09 From FishC Mobile | 显示全部楼层
这题貌似很简单啊,我在手机上算的,也很快就算出来。由于1+n/1=1+n=质数,所以n必然是质数-1,只要计算1亿以下所有质数-1的数就可以了。
答案:1739023853137
  1. def gen_primes(n):
  2.   global primes
  3.   primes=[1]*n
  4.   primes[:2]=[0]*2
  5.   for i in xrange(2,int(n**0.5+1)):
  6.     if primes[i]:
  7.       for j in xrange(i*i,n,i):
  8.         primes[j]=0
  9.   return [k-1 for k,v in enumerate(primes) if v]
  10. lst = gen_primes(100000000)
  11. def check(n):
  12.   for i in xrange(2,int(n**0.5+1)):
  13.     if n%i==0:
  14.       if not primes[i+n//i]: return False
  15.   return True
  16. print sum(each for each in lst if check(each))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-30 14:53:00 | 显示全部楼层
  1. from numba import jit

  2. @jit
  3. def isPrime(num):
  4.     if num <= 1:
  5.         return False
  6.     if num ==2:
  7.         return True
  8.     if num % 2 == 0:
  9.         return False
  10.     i = 3
  11.     while i <= num**0.5:
  12.         if (num % i == 0):
  13.             return False
  14.         i+=2
  15.     return True

  16. count=0
  17. for n in range(1,100000000):
  18.     for d in range(1,int(n**0.5+1)):
  19.         if n%d == 0:
  20.             if isPrime(d+n/d) == False:
  21.                 break
  22.     else:
  23.         count+=n

  24. print(count)
复制代码


结果是:1739023853137
但是运行时间很久...等看大神的高级算法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-30 21:34:24 | 显示全部楼层
def isSushu(n):
    flag=True
    for i in range(2,n//2+1):
        if n%i==0:
            flag=False
            break
    return flag
'''
for i in range(2,20):
    if isSushu(i):
        print(i)
   
'''
for i in range(2,10000):
    flag1=True
    for j in range(1,i//2+1):
        if i%j==0:
            if   isSushu(int(j+i/j))==False:
                flag1=False
                break
    if flag1:
        print(i)


wo de xiao lv you man qing ci jiao  shu ru fa tu ran bu hao shi le       jian liang
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-31 21:44:19 | 显示全部楼层
本帖最后由 gunjang 于 2017-11-2 23:58 编辑

占楼。。。速度原来200s,改到40s左右
答案1739023853137
  1. import time
  2. import numpy as np
  3. import itertools

  4. st = time.time()
  5. #n is square free,else if n=a*p^2 p+n/p=p+ap=p(1+a) is not prime

  6. def solve(limit):
  7.         primes = np.ones(limit, dtype=np.bool)
  8.         for i in range(2, int(limit**0.5)+1):
  9.                 if primes[i]: primes[i*i::i] = False
  10.         primes[0], primes[1] = False, False
  11.         plist = np.nonzero(primes)[0]
  12.         #print(len(plist))
  13.        
  14.         def isSquareFree(n): #return True/False and prime factors
  15.                 r = []
  16.                 for p in plist:
  17.                         if n%p == 0:
  18.                                 n //= p
  19.                                 if n%p == 0:
  20.                                         return False, []
  21.                                 r.append(p)
  22.                                 if primes[n]:
  23.                                         r.append(n)
  24.                                         return True, r

  25.         r = 3# 3.0 in 32bit
  26.         for i in range(2, len(plist)): #5,7...
  27.                 n = plist[i]-1
  28.                 sf, pFactors = isSquareFree(n)
  29.                 if sf:
  30.                         for cnt in range(1, len(pFactors)//2 + 1):
  31.                                 for cb in itertools.combinations(pFactors, cnt):
  32.                                         pro = 1 #list mul
  33.                                         for x in cb: pro *= x
  34.                                         if not primes[pro + n//pro]:                                               
  35.                                                 break
  36.                                 else:
  37.                                         continue
  38.                                 break
  39.                         else:
  40.                                 r += n

  41.         return r #overflow in 32bit

  42. #print('%.20f'%solve(100000000)) # 1739023853137
  43. print(solve(100000000))# 1739023853137
  44. print('cost %fs'%(time.time()-st)) #100m cost 243s ==>77s => 41s
复制代码

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

使用道具 举报

发表于 2017-10-31 22:01:09 | 显示全部楼层
  1. #素数判断函数
  2. def is_prime(n):
  3.   if n < 2:
  4.     return False
  5.   for i in range(2, int(n**0.5+1)):
  6.     if n%i == 0:
  7.       return False
  8.   return True

  9. #判断正整数n是否符合要求
  10. def fun(n):
  11.     m = 1
  12.     if n == 1:
  13.       return True
  14.     while m <= n:
  15.         if n % m == 0 and n // m >= m: #m为n的约数
  16.             if is_prime(m + n//m):
  17.                 m += 1
  18.                 continue
  19.             else:
  20.                 return False
  21.         elif n % m != 0 and n // m >= m: # m不是n的约数
  22.             m += 1
  23.         else:
  24.             return True

  25. #(素数-1)生成器
  26. def prime_generator(n):
  27.   for x in range(n):
  28.     if is_prime(x):
  29.       yield x-1

  30. # 计算和
  31. def sumfun(n):
  32.     total = 0
  33.     for x in prime_generator(n):
  34.         if fun(x):
  35.             total += x
  36.     return total
复制代码


结果:
>>> sumfun(100000000)
1739023853137

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

使用道具 举报

发表于 2017-11-3 15:45:51 | 显示全部楼层
#判断一个数是否是质数,如果是质数则返回true,否则返回false

def ifSimple(num):
#判断参数是否大于1

    if num > 1:
        # 查看因子
        for i in range(2,num):
            if(num%i==0):
                flag = False
                #print(flag,1)
                return flag
                break
        else:  
            flag = True
            #print(flag,2)
            return flag
   
    else:
        flag = False
        #print(flag,3)
        return flag


#求一个数的所有约数:
def getDivisor(x):
    divisor = []
    for i in range(1,x+1):
        if x%i==0:
            temple = [i]
            divisor.append(i)
    #print('divisor:',divisor)
    return divisor


#求符合要求的数:
def divisorIfSimple(num):
    result=0
    list = getDivisor(num)
    for d in list:
        if(ifSimple(int(d+num/d))==False):
            return result
            break
    else:
        result = num
        return result


求范围类符合要求的数字之和:
from builtins import range, int
from divisorIfSimple import *
from _ast import Num

def getSum(num):
    list = []
    for i in range(1,num+1):
        if(divisorIfSimple(i)!=0):
            list.append(i)
    return list   
        
        

if __name__ == "__main__":
     
     num = int(input("请输入一个正整数:"))
     list = getSum(num)
     print("不大于%d的满足要求所有数的和为:%d"%(num,sum(list)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 17:53:43 | 显示全部楼层
本帖最后由 Anner5 于 2017-11-6 18:30 编辑
  1. '''
  2. 答案:111894087333395
  3. 耗时:168.62847995758057

  4. 思路:
  5. 1、生成10**8的素数列表;
  6. 2、筛选10**8的素数列表中为素数一次幂乘积的素数;
  7. 3、对不符的*1x3x2+1类型素数求和;
  8. 4、求和结果
  9. 说明:2、3点为在100以内验证所得
  10. 运行结果:
  11. 110.41659569740295
  12. 162.73110127449036
  13. 111894087333335
  14. 164.10227394104004
  15. '''
  16. import time
  17. from itertools import *
  18. startTime = time.time()
  19. n=10**8
  20. compositeNumberList = [None] * (n+1)
  21. compositeNumberList[0] = True
  22. primeNumber = []
  23. k=2
  24. while k <= n:
  25.     if not compositeNumberList[k]:
  26.         primeNumber.append(k)
  27.         j = 2
  28.         while k * j <= n:
  29.             compositeNumberList[k * j] = True
  30.             j +=1
  31.         
  32.     k +=1
  33. a ={}
  34. a = a.fromkeys(primeNumber,False)
  35. b = []
  36. i=0
  37. while i < len(primeNumber):
  38.     x = primeNumber[i]
  39.     if not a[x]:
  40.         b.append(x)
  41.         j = 1
  42.         while x ** 2 * j +1 <= primeNumber[-1]:
  43.             a[x ** 2 * j +1] = True
  44.             j +=1
  45.         
  46.     i +=1
  47. y=0
  48. for each in b:
  49.     if int(str(each)[-1]) ==1 and y*6 < b[-1]:
  50.         y +=each
  51. print(sum(b)-len(b)-y*6)
  52. print(time.time()-startTime)



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

使用道具 举报

发表于 2017-11-13 11:50:50 | 显示全部楼层
'累死了我的CPU
import math

def isPrime(n):
    if n == 1:
        return False
   
    for i in range(2, int(math.sqrt(n) + 1)):
        if (n % i == 0):
            return False

    return True

def check(num):
    for i in range(1, num + 1):
        if (num % i == 0):
            if (not isPrime(i + int(num / i))):
                return False

    return True

def sum(n):
    result = 0
    for i in range(n + 1):
        if (check(i)):
            result += i

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 15:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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