F(N), (0,0), (N, 0), (0, N) ve (N, N) noktalarından geçen bir daire üzerinde olan tam sayı koordinatlarına sahip noktaların sayısı olsun.
F (10000) = 36 olduğu gösterilebilir.
F(N) = 420 olan tüm pozitif N ≤ 1011 tam sayılarının toplamı nedir?
Cevap: 271204031455541309
C++:
N=400000; A=vector(N);
highestpower(i)=if(i%2==1,0,1+highestpower(i/2)) for(i=1,N,\ ifact=factor(i);\ L=matsize(ifact);\ L=L[1];\ isok=1;\ for(j=1,L,if(ifact[j,1]%4==1,isok=0;));\ if(isok==1,j=i;while(j<=N,A[j]+=i;j+=2^highestpower(j);))) B=vector(N); for(i=1,N,\ j=i;\ while(j>0,B[i]+=A[j];j-=2^highestpower(j);)) count=0; n=100000000000; for(a=2,70,\ for(b=2,70,\ if(a*b==105,\ x=(a-1)/2;y=(b-1)/2;\ p1=5;\ while(p1^(x+y)<=n,\ if(isprime(p1),\ p2=p1+4;\ while(p1^x*p2^(y)<=n,\ if(isprime(p2),\ number=p1^x*p2^y;\ count+=number*B[n\number];);\ p2+=4;));\ p1+=4;)))) for(a=2,10,\ for(b=2,10,\ for(c=2,10,\ if(a*b*c==105,\ x=(a-1)/2;y=(b-1)/2;z=(c-1)/2;\ p1=5;\ while(p1^(x+y+z)<=n,\ if(isprime(p1),\ p2=p1+4;\ while(p1^x*p2^(y+z)<=n,\ if(isprime(p2),\ p3=p2+4;\ while(p1^x*p2^y*p3^z<=n,\ if(isprime(p3),\ number=p1^x*p2^y*p3^z;\ count+=number*B[n\number];);\ p3+=4;\ ));\ p2+=4;));\ p1+=4;))))) count
Python:
import math nmax = 5000000 primes = nmax*[True] primes[0:2] = [False,False] for x in range(2, int(math.sqrt(len(primes)) + 1)): if primes[x]: for y in range(2 * x, len(primes), x): primes[y] = False p = [x for x in range(len(primes)) if primes[x] and x % 4 == 1] q = [x for x in range(len(primes)) if primes[x] and x % 4 != 1] n = 10 ** 11 s = 0 def cnt(x, i = 0): global s s += x for j in range(i, len(q)): if x * q[j] > n: break cnt(x * q[j], j) for a in p: if a ** 3 > n: break for b in p: if b != a: if a ** 3 * b ** 2 > n: break for c in p: if c != a and c != b: if a ** 3 * b ** 2 * c > n: break cnt(a ** 3 * b ** 2 * c) for a in p: if a ** 7 > n: break for b in p: if b != a: if a ** 7 * b ** 3 > n: break cnt(a ** 7 * b ** 3) for a in p: if a ** 10 > n: break for b in p: if b != a: if a ** 10 * b ** 2 > n: break cnt(a ** 10 * b ** 2) print(s)
Haskell:
module Main where import Utils import Data.List main :: IO () main = print . foldl' (+) 0 $ solve (10^11) solve :: Integer -> [Integer] solve maxn = concatMap (multiples maxn) (baseNums maxn) coolPrimes :: [Integer] coolPrimes = filter ((== 1) . (`mod` 4)) primes uncoolPrimes :: [Integer] uncoolPrimes = filter ((/= 1) . (`mod` 4)) primes uncoolNums :: Integer -> [Integer] uncoolNums maxd = go 1 uncoolPrimes where go d pps@(p:ps) | d > maxd = [] | dp > maxd = [d] | otherwise = go dp pps ++ go d ps where dp = d * p expPatterns :: [[Integer]] expPatterns = concatMap permutations [[1,2,3],[3,7],[2,10]] baseNums :: Integer -> [Integer] baseNums maxn = go 1 coolPrimes =<< expPatterns where go n _ _ | n > maxn = [] go n _ [] = [n] go n pps@(p:ps) ees@(e:es) | minn > maxn = [] | otherwise = go (n * p^e) ps es ++ go n ps ees where minn = n * product (zipWith (^) pps ees) multiples :: Integer -> Integer -> [Integer] multiples maxn n = map (* n) (uncoolNums (maxn `div` n))