211.py 1.2 KB

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