def find_sum(self, limit, modulo=(2 ** 32)): out = 0 self.limit = limit self.primes = mylib.make_primes_sieve_atkin(limit) print('found', len(self.primes), 'primes') not_hamming = self.make_sieve() return (int((self.limit * (self.limit + 1)) // 2) - sum(not_hamming)) % modulo
def find_sum(self, limit, modulo=(2**32)): out = 0 self.limit = limit self.primes = mylib.make_primes_sieve_atkin(limit) print('found', len(self.primes), 'primes') not_hamming = self.make_sieve() return (int( (self.limit * (self.limit + 1)) // 2) - sum(not_hamming)) % modulo
def sigma2(self, n): r = math.floor(n ** 0.5) pp = mylib.make_primes_sieve_atkin(n) modulo_plus = self.modulo * 10 nm = n % modulo_plus out = ((nm - 1) + int((nm * (nm + 1) * (2 * nm + 1) / 6))) % self.modulo for p in pp: k = n // p pm = p % self.modulo out = (out + (pm ** 2) * (k - 1)) % self.modulo print(p, '/', n, out) print(out) return out
def test(self): p = 4 self.pp = mylib.make_primes_sieve_atkin(10 ** p) self.make_right_harshads(p - 1).filter_strong().make_primes() for hh in self.hhh: print(hh) print(self.ss) print(sum(self.rr), 90619 - sum(self.rr), self.rr) # h = Harshad(3608528850368400786036725) # print(h, h.is_harshad, h.is_right()) # print(len(pp), sum(len(hh) for hh in self.hhh)) # print(pp) # print(self.hhh) return False
def sigma2(self, n): r = math.floor(n**0.5) pp = mylib.make_primes_sieve_atkin(n) modulo_plus = self.modulo * 10 nm = n % modulo_plus out = ((nm - 1) + int( (nm * (nm + 1) * (2 * nm + 1) / 6))) % self.modulo for p in pp: k = n // p pm = p % self.modulo out = (out + (pm**2) * (k - 1)) % self.modulo print(p, '/', n, out) print(out) return out
def find_triplets(self): # self.triplets = [] pp = mylib.make_primes_sieve_atkin(self.limit) bb = dict() r = int(self.limit**0.5 // 1) ss = [x**2 for x in pp if x < r] print(len(pp), "primes, last 10:", sorted(pp)[-10:]) print(len(ss), "squares, last 10:", ss[-10:], "\n") for a in pp: print("\033[F\033[K", a, "filtering") a1 = a + 1 for s in ss: if s > a1: bb[a] = (a1, 1) break if not a1 % s: b = a1 // s if (b - 1) in bb and bb[b - 1][0] != b: bb[a] = (bb[b - 1][0], a1 // b * bb[b - 1][1]) else: bb[a] = (b, a1 // b) break else: bb[a] = (a1, 1) continue _aaa = dict() for a in bb: print("\033[F\033[K", a, 'combining') b = bb[a][0] if b not in _aaa: _aaa[b] = dict() _aaa[b][a] = round(bb[a][1]**(1 / 2)) aaa = dict() n = 0 for b in _aaa: l = len(_aaa[b]) if l > 1: print("\033[F\033[K", b, "use elements with len > 1:", l) aaa[b] = _aaa[b] n += l * (l - 1) // 2 # else: # print("\033[F\033[K", k, "remove elements with len = 1") k = len(aaa) print("TOTAL", k, "keys to iterate") print("TOTAL", n, "iterations\n") bb = sorted(aaa.keys()) k1 = 0 n1 = 0 for b in bb: k1 += 1 aa = aaa[b] rr = sorted(aa.keys()) l = len(rr) print(k1, "/", k, ":", b, l, rr, "\n") for i in range(0, l): for j in range(i + 1, l): n1 += 1 p = rr[i] q = rr[j] r = b * aa[p] * aa[q] - 1 if r not in pp: continue t = (p, r, q) self.triplets.append(t) print("\033[F\033[K", n1, "/", n, t, len(self.triplets)) return self
import mylib, sys L = 10 ** 2 pp = mylib.make_primes_sieve_atkin(L) def my_fact2(p): out = 1 if p < 10: for x in range(1, p - 4): out = (out * x) % p return out out = 24 % p for x in range(5, (p + 1) // 2): out = (((p - out) * x) % p * x) % p return out def s3(p): return (my_fact2(p) * 9) % p sigma = 0 for a in pp: if a < 5: continue sa = s3(a) sigma += sa print("\033[F\033[K", end="") print(a, sa) print(sigma)
def find_triplets(self): # self.triplets = [] pp = mylib.make_primes_sieve_atkin(self.limit) bb = dict() r = int(self.limit ** 0.5 // 1) ss = [x ** 2 for x in pp if x < r] print(len(pp), "primes, last 10:", sorted(pp)[-10:]) print(len(ss), "squares, last 10:", ss[-10:], "\n") for a in pp: print("\033[F\033[K", a, "filtering") a1 = a + 1 for s in ss: if s > a1: bb[a] = (a1, 1) break if not a1 % s: b = a1 // s if (b - 1) in bb and bb[b - 1][0] != b: bb[a] = (bb[b - 1][0], a1 // b * bb[b - 1][1]) else: bb[a] = (b, a1 // b) break else: bb[a] = (a1, 1) continue _aaa = dict() for a in bb: print("\033[F\033[K", a, 'combining') b = bb[a][0] if b not in _aaa: _aaa[b] = dict() _aaa[b][a] = round(bb[a][1] ** (1 / 2)) aaa = dict() n = 0 for b in _aaa: l = len(_aaa[b]) if l > 1: print("\033[F\033[K", b, "use elements with len > 1:", l) aaa[b] = _aaa[b] n += l * (l - 1) // 2 # else: # print("\033[F\033[K", k, "remove elements with len = 1") k = len(aaa) print("TOTAL", k, "keys to iterate") print("TOTAL", n, "iterations\n") bb = sorted(aaa.keys()) k1 = 0 n1 = 0 for b in bb: k1 += 1 aa = aaa[b] rr = sorted(aa.keys()) l = len(rr) print(k1, "/", k, ":", b, l, rr, "\n") for i in range(0, l): for j in range(i + 1, l): n1 += 1 p = rr[i] q = rr[j] r = b * aa[p] * aa[q] - 1 if r not in pp: continue t = (p, r, q) self.triplets.append(t) print("\033[F\033[K", n1, "/", n, t, len(self.triplets)) return self
import mylib primes = mylib.make_primes_sieve_atkin(10 ** 4) # a ** b means a in power of b, in this case 10000 harshads_by_power_of_ten = list() harshads_by_power_of_ten.append([]) # append ~ push a new element in the list harshads_by_power_of_ten.append([1, 2, 3, 4, 5, 6, 7, 8, 9]) def make_right_harshads(power_of_ten): if len(harshads_by_power_of_ten) < power_of_ten: make_right_harshads(power_of_ten - 1) previous_harshads = harshads_by_power_of_ten[power_of_ten - 1] harshads_new = [] for harshad_number in previous_harshads: harshads_new += gen_next_right_harshads(power_of_ten, harshad_number) harshads_by_power_of_ten.append(harshads_new) print('-' * 79) def gen_next_right_harshads(power_of_ten, previous_harshad_number): out = list() new_base = 10 * previous_harshad_number remainder = new_base % power_of_ten if not remainder: out.append(new_base) # add 20, 240, 3240 etc for x in range(power_of_ten - remainder, 10, power_of_ten): # ~ for (i=p-r; i<10; i+=p) out.append(new_base + x) # for example, for 220, cycle goes through 3-1 = 2, 5, 8 and we store 222, 225, 228 print(power_of_ten, previous_harshad_number, out) return out
import mylib primes = mylib.make_primes_sieve_atkin( 10**4) # a ** b means a in power of b, in this case 10000 harshads_by_power_of_ten = list() harshads_by_power_of_ten.append([]) # append ~ push a new element in the list harshads_by_power_of_ten.append([1, 2, 3, 4, 5, 6, 7, 8, 9]) def make_right_harshads(power_of_ten): if len(harshads_by_power_of_ten) < power_of_ten: make_right_harshads(power_of_ten - 1) previous_harshads = harshads_by_power_of_ten[power_of_ten - 1] harshads_new = [] for harshad_number in previous_harshads: harshads_new += gen_next_right_harshads(power_of_ten, harshad_number) harshads_by_power_of_ten.append(harshads_new) print('-' * 79) def gen_next_right_harshads(power_of_ten, previous_harshad_number): out = list() new_base = 10 * previous_harshad_number remainder = new_base % power_of_ten if not remainder: out.append(new_base) # add 20, 240, 3240 etc for x in range(power_of_ten - remainder, 10, power_of_ten): # ~ for (i=p-r; i<10; i+=p) out.append(new_base + x) # for example, for 220, cycle goes through 3-1 = 2, 5, 8 and we store 222, 225, 228