示例#1
0
 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
示例#2
0
 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
示例#3
0
 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
示例#4
0
 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
示例#5
0
 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
示例#6
0
    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
示例#7
0
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)
示例#8
0
    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
示例#9
0
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
示例#10
0
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