Algorithm


Problem link- https://www.spoj.com/problems/DBLPRM/

DBLPRM - Double Primes

no tags 

 

You're given a number N. You have to say, is that number sum of two prime numbers or not.

Input

Single number N (1<=N<=10^15)

Output

Single word - "YES" or "NO".

Example

Input:
14

Output:
YES

 

Code Examples

#1 Code Example with Python Programming

Code - Python Programming

import random

# this part is copied from rosettacode :)

_mrpt_num_trials = 5 # number of bases to test

def is_probable_prime(n):
    """
        Miller-Rabin primality test.
        
        A return value of False means n is certainly not prime. A return value of
        True means n is very likely a prime.
        
        >>> is_probable_prime(1)
        Traceback (most recent call last):
        ...
        AssertionError
        >>> is_probable_prime(2)
        True
        >>> is_probable_prime(3)
        True
        >>> is_probable_prime(4)
        False
        >>> is_probable_prime(5)
        True
        >>> is_probable_prime(123456789)
        False
        
        >>> primes_under_1000 = [i for i in range(2, 1000) if is_probable_prime(i)]
        >>> len(primes_under_1000)
        168
        >>> primes_under_1000[-10:]
        [937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
        
        >>> is_probable_prime(6438080068035544392301298549614926991513861075340134\
        3291807343952413826484237063006136971539473913409092293733259038472039\
        7133335969549256322620979036686633213903952966175107096769180017646161\
        851573147596390153)
        True
        
        >>> is_probable_prime(7438080068035544392301298549614926991513861075340134\
        3291807343952413826484237063006136971539473913409092293733259038472039\
        7133335969549256322620979036686633213903952966175107096769180017646161\
        851573147596390153)
        False
        """
    assert n >= 2
    # special case 2
    if n == 2:
        return True
    # ensure n is odd
    if n % 2 == 0:
        return False
    # write n-1 as 2**s * d
    # repeatedly try to divide n-1 by 2
    s = 0
    d = n-1
    while True:
        quotient, remainder = divmod(d, 2)
        if remainder == 1:
            break
        s += 1
        d = quotient
    assert(2**s * d == n-1)

# test the base a to see whether it is a witness for the compositeness of n
def try_composite(a):
    if pow(a, d, n) == 1:
        return False
        for i in range(s):
            if pow(a, 2**i * d, n) == n-1:
                return False
    return True # n is definitely composite

for i in range(_mrpt_num_trials):
    a = random.randrange(2, n)
        if try_composite(a):
            return False

return True # no base tested showed n as composite
N = int(input())
if N < 4:
    print('NO')
elif N % 2 == 0:
    print('YES')
else:
    p = [1] * 305
    for i in range(2, 305):
        if p[i] == 1:
            if N > i and is_probable_prime(N - i):
                print('YES')
                exit(0)
        for j in range(i + i, 305, i):
            p[j] = 0
    print('NO')
Copy The Code & Try With Live Editor

Input

x
+
cmd
14

Output

x
+
cmd
YES
Advertisements

Demonstration


SPOJ Solution-Double Primes-Solution in C, C++, Java, Python

Previous
SPOJ Solution - Test Life, the Universe, and Everything - Solution in C, C++, Java, Python