211.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from math import sqrt
  2. from functools import reduce
  3. def appendEs2Sequences(sequences,es):
  4. result=[]
  5. if not sequences:
  6. for e in es:
  7. result.append([e])
  8. else:
  9. for e in es:
  10. result+=[seq+[e] for seq in sequences]
  11. return result
  12. def cartesianproduct(lists):
  13. return reduce(appendEs2Sequences,lists,[])
  14. def primefactors(n):
  15. i = 2
  16. while i<=sqrt(n):
  17. if n%i==0:
  18. l = primefactors(n/i)
  19. l.append(i)
  20. return l
  21. i+=1
  22. return [n]
  23. def factorGenerator(n):
  24. p = primefactors(n)
  25. factors={}
  26. for p1 in p:
  27. try:
  28. factors[p1]+=1
  29. except KeyError:
  30. factors[p1]=1
  31. return factors
  32. def divisors(n):
  33. factors = factorGenerator(n)
  34. divisors=[]
  35. listexponents=[[k**x for x in range(0,factors[k]+1)] for k in list(factors.keys())]
  36. listfactors=cartesianproduct(listexponents)
  37. for f in listfactors:
  38. divisors.append(reduce(lambda x, y: x*y, f, 1))
  39. divisors.sort()
  40. return divisors
  41. def is_square(apositiveint):
  42. x = apositiveint // 2
  43. seen = set([x])
  44. while x * x != apositiveint:
  45. x = (x + (apositiveint // x)) // 2
  46. if x in seen: return False
  47. seen.add(x)
  48. return True
  49. def o2(n):
  50. sumsq = 0
  51. for factor in divisors(n):
  52. sumsq += factor**2
  53. return sumsq
  54. def main():
  55. divsqsum = 0
  56. for i in range(1,64000000):
  57. if is_square(o2(i)):
  58. divsqsum += o2(i)
  59. print(o2(i))
  60. print(divsqsum)
  61. main()