fork(3) download
  1. '''http://c...content-available-to-author-only...e.com/recipes/117119/'''
  2.  
  3. from itertools import count,islice,groupby
  4. from timeit import Timer
  5. import collections
  6. from heapq import merge
  7. import __main__
  8.  
  9.  
  10. '''
  11. Unserstanding code from here: http://stackoverflow.com/a/10733621/862380
  12. postponed sieve, by Will Ness
  13. See also: http://i...content-available-to-author-only...e.com/WFv4f
  14. '''
  15. def primes4(debug=False,level=0):
  16. '''The space complexity is needlessly O(n). O(sqrt(n)) is enough indeed,
  17. achieved by postponing the addition of stepping information for a prime
  18. into the dict until that prime's square is seen amongst the candidates,
  19. and not a moment sooner.
  20. Having much smaller dict, performance and empirical time complexity improve too.
  21. http://i...content-available-to-author-only...e.com/WFv4f'''
  22.  
  23. name = '{0}'.format(level)
  24.  
  25. print = __builtins__.print if debug else lambda *p: None
  26.  
  27. print('{name}: yield 2'.format(name=name)); yield 2
  28. print('{name}: yield 3'.format(name=name)); yield 3
  29. print('{name}: yield 5'.format(name=name)); yield 5
  30. print('{name}: yield 7'.format(name=name)); yield 7
  31. D = {}
  32. c = 9; print('{name}: c = {c}'.format(name=name,c=c))
  33. ps = (p for p in primes4(debug=debug,level=level+1)); print('{name}: Creating subiterator'.format(name=name))
  34. temp = next(ps)
  35. print('{name}: skip {temp}'.format(name=name,temp=temp)) #skip 2
  36. p = next(ps); print('{name}: p = {p}'.format(name=name,p=p)) # 3
  37. q = p*p; print('{name}: q = {q}'.format(name=name,q=q)) # 9
  38. while True:
  39. print('{name}: D = {D}'.format(name=name,D=D))
  40. if c not in D:
  41. print('{name}: c not in D'.format(name=name))
  42. if c < q:
  43. print('{name}: c<q'.format(name=name))
  44. print('{name}: yield c = {c}'.format(name=name,c=c))
  45. yield c
  46. else:
  47. print('{name}: c=q'.format(name=name))
  48. x = add(D,c+2*p,2*p); print('{name}: D[{x}]={s}'.format(name=name,x=x,s=2*p))
  49. p = next(ps); print('{name}: p = {p}'.format(name=name,p=p))
  50. q = p*p; print('{name}: q = {q}'.format(name=name,q=q))
  51. else:
  52. print('{name}: c in D'.format(name=name))
  53. s = D.pop(c); print('{name}: popping from D: s = {s}'.format(name=name,s=s))
  54. x = add(D, c+s, s); print('{name}: adding to D[{x}]={s}'.format(name=name,x=x,s=c+s))
  55. c += 2; print('{name}: c+=2 -> c={c}'.format(name=name,c=c))
  56.  
  57.  
  58. def add(D,x,s):
  59. while x in D:
  60. x += s
  61. D[x] = s
  62. return x
  63.  
  64.  
  65. def main1():
  66. '''Just '''
  67. n = 20
  68. next(islice(primes4(debug=True), n, n), None) #consume n values
  69.  
  70.  
  71. if __name__=='__main__':
  72. main1()
Success #stdin #stdout 0.02s 5836KB
stdin
Standard input is empty
stdout
0: yield 2
0: yield 3
0: yield 5
0: yield 7
0: c = 9
0: Creating subiterator
1: yield 2
0: skip 2
1: yield 3
0: p = 3
0: q = 9
0: D = {}
0: c not in D
0: c=q
0: D[15]=6
1: yield 5
0: p = 5
0: q = 25
0: c+=2 -> c=11
0: D = {15: 6}
0: c not in D
0: c<q
0: yield c = 11
0: c+=2 -> c=13
0: D = {15: 6}
0: c not in D
0: c<q
0: yield c = 13
0: c+=2 -> c=15
0: D = {15: 6}
0: c in D
0: popping from D: s = 6
0: adding to D[21]=21
0: c+=2 -> c=17
0: D = {21: 6}
0: c not in D
0: c<q
0: yield c = 17
0: c+=2 -> c=19
0: D = {21: 6}
0: c not in D
0: c<q
0: yield c = 19
0: c+=2 -> c=21
0: D = {21: 6}
0: c in D
0: popping from D: s = 6
0: adding to D[27]=27
0: c+=2 -> c=23
0: D = {27: 6}
0: c not in D
0: c<q
0: yield c = 23
0: c+=2 -> c=25
0: D = {27: 6}
0: c not in D
0: c=q
0: D[35]=10
1: yield 7
0: p = 7
0: q = 49
0: c+=2 -> c=27
0: D = {35: 10, 27: 6}
0: c in D
0: popping from D: s = 6
0: adding to D[33]=33
0: c+=2 -> c=29
0: D = {35: 10, 33: 6}
0: c not in D
0: c<q
0: yield c = 29
0: c+=2 -> c=31
0: D = {35: 10, 33: 6}
0: c not in D
0: c<q
0: yield c = 31
0: c+=2 -> c=33
0: D = {35: 10, 33: 6}
0: c in D
0: popping from D: s = 6
0: adding to D[39]=39
0: c+=2 -> c=35
0: D = {35: 10, 39: 6}
0: c in D
0: popping from D: s = 10
0: adding to D[45]=45
0: c+=2 -> c=37
0: D = {45: 10, 39: 6}
0: c not in D
0: c<q
0: yield c = 37
0: c+=2 -> c=39
0: D = {45: 10, 39: 6}
0: c in D
0: popping from D: s = 6
0: adding to D[51]=45
0: c+=2 -> c=41
0: D = {51: 6, 45: 10}
0: c not in D
0: c<q
0: yield c = 41
0: c+=2 -> c=43
0: D = {51: 6, 45: 10}
0: c not in D
0: c<q
0: yield c = 43
0: c+=2 -> c=45
0: D = {51: 6, 45: 10}
0: c in D
0: popping from D: s = 10
0: adding to D[55]=55
0: c+=2 -> c=47
0: D = {51: 6, 55: 10}
0: c not in D
0: c<q
0: yield c = 47
0: c+=2 -> c=49
0: D = {51: 6, 55: 10}
0: c not in D
0: c=q
0: D[63]=14
1: c = 9
1: Creating subiterator
2: yield 2
1: skip 2
2: yield 3
1: p = 3
1: q = 9
1: D = {}
1: c not in D
1: c=q
1: D[15]=6
2: yield 5
1: p = 5
1: q = 25
1: c+=2 -> c=11
1: D = {15: 6}
1: c not in D
1: c<q
1: yield c = 11
0: p = 11
0: q = 121
0: c+=2 -> c=51
0: D = {63: 14, 51: 6, 55: 10}
0: c in D
0: popping from D: s = 6
0: adding to D[57]=57
0: c+=2 -> c=53
0: D = {63: 14, 57: 6, 55: 10}
0: c not in D
0: c<q
0: yield c = 53
0: c+=2 -> c=55
0: D = {63: 14, 57: 6, 55: 10}
0: c in D
0: popping from D: s = 10
0: adding to D[65]=65
0: c+=2 -> c=57
0: D = {63: 14, 57: 6, 65: 10}
0: c in D
0: popping from D: s = 6
0: adding to D[69]=63
0: c+=2 -> c=59
0: D = {63: 14, 69: 6, 65: 10}
0: c not in D
0: c<q
0: yield c = 59
0: c+=2 -> c=61
0: D = {63: 14, 69: 6, 65: 10}
0: c not in D
0: c<q
0: yield c = 61
0: c+=2 -> c=63
0: D = {63: 14, 69: 6, 65: 10}
0: c in D
0: popping from D: s = 14
0: adding to D[77]=77
0: c+=2 -> c=65
0: D = {69: 6, 77: 14, 65: 10}
0: c in D
0: popping from D: s = 10
0: adding to D[75]=75
0: c+=2 -> c=67
0: D = {75: 10, 69: 6, 77: 14}
0: c not in D
0: c<q
0: yield c = 67
0: c+=2 -> c=69
0: D = {75: 10, 69: 6, 77: 14}
0: c in D
0: popping from D: s = 6
0: adding to D[81]=75
0: c+=2 -> c=71
0: D = {81: 6, 75: 10, 77: 14}
0: c not in D
0: c<q
0: yield c = 71