예제 #1
0
def main():
    N = 10**8
    sq_coprime_sum = np.zeros((N + 1, ), dtype=np.uint32)
    result_real = np.zeros((N + 1, ), dtype=np.uint32)
    result_imag = np.zeros((N + 1, ), dtype=np.uint32)
    print("successfully allocated")

    sq_coprime_sum[2] = 2  # 1*1 + 1*1 = 2
    for i in range(1, int(sqrt(N)) + 1):
        for j in range(i + 1, int(sqrt(N)) + 1):
            squared_sum = i * i + j * j
            if squared_sum > N:
                break
            if gcd(i, j) == 1:
                sq_coprime_sum[squared_sum] += 2 * (i + j)
                # print(i, j, squared_sum)
    # print(sq_coprime_sum)
    print("sq_coprime_sum computed by", time() - starting_time)

    for i in range(1, N + 1):
        for j in range(i, N + 1, i):
            result_real[j] += i
    print("real part computed by", time() - starting_time)

    for i in range(1, N + 1):
        if sq_coprime_sum[i] == 0:
            continue
        for j in range(i, N + 1, i):
            result_imag[j] += sq_coprime_sum[i] * result_real[j // i]
    print("complex part computed by", time() - starting_time)

    # print(list(zip(result_real, result_imag)))
    print(sum(map(int, result_real)) + sum(map(int, result_imag)))
예제 #2
0
def main():
    N = 10 ** 8
    sq_coprime_sum = np.zeros((N + 1,), dtype=np.uint32)
    result_real = np.zeros((N + 1,), dtype=np.uint32)
    result_imag = np.zeros((N + 1,), dtype=np.uint32)
    print("successfully allocated")

    sq_coprime_sum[2] = 2  # 1*1 + 1*1 = 2
    for i in range(1, int(sqrt(N)) + 1):
        for j in range(i + 1, int(sqrt(N)) + 1):
            squared_sum = i * i + j * j
            if squared_sum > N:
                break
            if gcd(i, j) == 1:
                sq_coprime_sum[squared_sum] += 2 * (i + j)
                # print(i, j, squared_sum)
    # print(sq_coprime_sum)
    print("sq_coprime_sum computed by", time() - starting_time)

    for i in range(1, N + 1):
        for j in range(i, N + 1, i):
            result_real[j] += i
    print("real part computed by", time() - starting_time)

    for i in range(1, N + 1):
        if sq_coprime_sum[i] == 0:
            continue
        for j in range(i, N + 1, i):
            result_imag[j] += sq_coprime_sum[i] * result_real[j // i]
    print("complex part computed by", time() - starting_time)

    # print(list(zip(result_real, result_imag)))
    print(sum(map(int, result_real)) + sum(map(int, result_imag)))
예제 #3
0
def terminate(numerator, denominator):
    left = denominator // gcd(numerator, denominator)
    while left % 2 == 0:
        left //= 2
    while left % 5 == 0:
        left //= 5
    if left == 1:  # terminate
        return -1
    else:          # non-terminate
        return 1
예제 #4
0
def parametrized():
    prog_sq = []
    for b in range(2, CBRT_N):
        for a in range(1, b):
            if a * a * a * b * b > N:
                break
            if gcd(a, b) != 1:
                continue
            for c in range(1, SQRT_N):
                candidate = c * a * a + c * c * a * b * b * b
                if candidate > N:
                    break
                if is_square(candidate):
                    prog_sq.append(candidate)
                    print(candidate, c * a * b)

    print(sum(prog_sq))
예제 #5
0
def parametrized():
    prog_sq = []
    for b in range(2, CBRT_N):
        for a in range(1, b):
            if a * a * a * b * b > N:
                break
            if gcd(a, b) != 1:
                continue
            for c in range(1, SQRT_N):
                candidate = c * a * a + c * c * a * b * b * b
                if candidate > N:
                    break
                if is_square(candidate):
                    prog_sq.append(candidate)
                    print(candidate, c * a * b)

    print(sum(prog_sq))
예제 #6
0
def _next_continued_fraction(x, y, z=1):
    """
    (√x + y)    reciprocal        z * (√x - y)        z * (√x - y)
    --------  =============>  --------------------- = ------------
        z                      (√x + y) * (√x - y)      x - y**2
    """
    assert x > y * y

    int_part = int(z * (sqrt(x) - y) / (x - y**2))
    common_divisor = gcd(z, x - y**2)

    denominator = (x - y**2) // common_divisor
    y = -y - int_part * denominator

    assert z == common_divisor, \
        'x={}, y={}, z={}'.format(x, y, z)

    return int_part, x, y, denominator
예제 #7
0
def _next_continued_fraction(x, y, z=1):
    """
    (√x + y)    reciprocal        z * (√x - y)        z * (√x - y)
    --------  =============>  --------------------- = ------------
        z                      (√x + y) * (√x - y)      x - y**2
    """
    assert x > y * y

    int_part = int(z * (sqrt(x) - y) / (x - y ** 2))
    common_divisor = gcd(z, x - y ** 2)

    denominator = (x - y ** 2) // common_divisor
    y = -y - int_part * denominator

    assert z == common_divisor, \
        'x={}, y={}, z={}'.format(x, y, z)

    return int_part, x, y, denominator
예제 #8
0
def least_common_multipler(S):
    lcm = [1]
    for s in range(2, S + 1):
        lcm.append(lcm[-1] * s // gcd(lcm[-1], s))
    return lcm
예제 #9
0
# project euler 141: Investigating progressive numbers,
#                    n, which are also square
"""
perfect_sq = d * q + r
d * d == q * r

perfect_sq = r + d ** 3 / r  (r < d)

            3
 2         d
n  = r + -----
           r

parametrize

gcd(a, b) = 1, b > a
         2
r = c * a
d = c * a * b

 2        2    2        3
n  = c * a  + c  * a * b
"""

from __future__ import division
from math import sqrt
from mathutil import gcd

N = 10**10  # not feasible for real problem size, see cpp version
SQRT_N = int(sqrt(N))
CBRT_N = int(N**(1 / 3))
예제 #10
0
# project euler 141: Investigating progressive numbers,
#                    n, which are also square


"""
perfect_sq = d * q + r
d * d == q * r

perfect_sq = r + d ** 3 / r  (r < d)

            3
 2         d
n  = r + -----
           r

parametrize

gcd(a, b) = 1, b > a
         2
r = c * a
d = c * a * b

 2        2    2        3
n  = c * a  + c  * a * b
"""

from __future__ import division
from math import sqrt
from mathutil import gcd

N = 10 ** 10     # not feasible for real problem size, see cpp version