def sum_isqrt(a,b): """ Returns the sum of the integer part of sqrt(i) for i in xrange(a,b) But this is O(log(b)) (for the isqrt computation) a and b are positive integers, b > a. """ ia,ib = isqrt(a),isqrt(b) if ia==ib: return ia*(b-a) return ia*((ia+1)**2-a) + ib*(b-(ib)**2) + lin_sum(ib-1)-lin_sum(ia) + 2*(square_sum(ib-1)-square_sum(ia))
def checkz(z,p): global k if p <0: return checkz(1/z,-p) elif p == 2: a,b = isqrt(z.numerator),isqrt(z.denominator) if a*a == z.numerator and b*b == z.denominator: return checkz(Fraction(a,b),1) else: return None elif p ==1: if z.denominator <= k and z < 1: return z
def convergents_sqrt_approx(n,bound=10**12): R = isqrt(n) if R*R == n: return (R,1) h = R k = 1 h1 = 1 h2 = 0 k1 = 0 k2 = 1 P = 0 Q = 1 a = R while True: h = a*h1 + h2 k = a *k1 + k2 if k > bound: maxn = (bound-k2) / k1 minn = (a+1)/2 if minn==maxn and a%2==0: th,tk = minn*h1+h2,minn*k1+k2 return closest_sqrt_approx((h1,k1),(th,tk),n) elif minn > maxn: return (h1,k1) else: return (maxn*h1+h2,maxn*k1+k2) break h2 = h1 k2 = k1 k1 = k h1 = h P = a*Q - P Q = (n - P*P) / Q a = (R+P)/Q
def sqrt_approx(n,bound=10**12): t = isqrt(n) if t*t == n: return (t,1) L = (t,1) H = (1,0) while True: num,denom = L[0]+H[0],L[1]+H[1] g = gcd(num,denom) if denom/g > bound: return closest_sqrt_approx(L,H,n) M = (num/g,denom/g) if M[0]*M[0] < n*M[1]*M[1]: L = M else: H = M
def dumb(n): seq = [1,1] c1 = 2 c2 = 1 #counter for 2-level sequence l=2 while True: if l == n: print seq return sum(seq) next = seq[c2] nsteps = isqrt(next) for ind in xrange(nsteps): seq.append(c1+ind) if l+ind+1==n: print seq return sum(seq) c1 += nsteps seq.append(next) l = l+nsteps+1 c2+=1
import proj_euler as pe import numpy as np import math cap = 10**5 sig2 = np.zeros(cap).astype(np.int64) s = 0 for i in xrange(1,cap): # j = i sq = i*i # while j < cap: # sig2[j] += sq # j += i sig2[i::i] = sig2[i::i] + sq s2 = sig2[i] t = pe.isqrt(s2) if t*t == s2: s += i print s
def is_sq(L): t = isqrt(L) if t*t == L: return True else: return False
t = isqrt(L) if t*t == L: return True else: return False s = 0 n = 1 m = 13 b = 16 sols = [1] while True: t1 = (b*b*5)/4 + 1 + 2*b t2 = t1 - 4*b if is_sq(t1): L = isqrt(t1) s += L print L,b sols.append(b) n+=1 if n%2==0: b = (b*sols[-1])/sols[-2] else: b = (b*sols[-2])/sols[-3] continue if n==m: print str(s) + " foo" break if is_sq(t2): L = isqrt(t1) s += L
#we want 6*k+2 <= n first_power_primes = np.load("e565primes.npy") for p in first_power_primes: if not p%2017 == 2016: print p plist = [(p,p) for p in first_power_primes] """ for k in xrange(1, (n/d)/6): p = d*k*6-1 if pe.MillerRabin(p): first_power_primes.append(p) p += 2*d if pe.MillerRabin(p): first_power_primes.append(p) print len(first_power_primes) np.save("e565primes",np.array(first_power_primes)) """ print len(first_power_primes) sq = pe.isqrt(n) primes = pe.primes_and_mask(sq)[0] #print plist[0] max_power = int(np.log(n)/np.log(2)) powers = {} for power in xrange(2, max_power): powers[power] = [] for p in primes: exp = p**power if exp > n: break # if p%2017 == 2016 and po: continue if ((exp*p-1)/(p-1)) % 2017 == 0: plist.append((exp, p)) # print plist[-1]
def fpi(n): if n <= len(primes): return pi(n) a = pi(isqrt(n)) return phi(n,a) + a - 1