Search code examples
pythonpython-3.xpartition-problem

Check if a number can be divided into prime partitions


Can somebody solve this problem on Python ?

A positive integer m can be partitioned as primes if it can be written as p + q where p > 0, q > 0 and both p and q are prime numbers.

Write a Python function that takes an integer m as input and returns True if m can be partitioned as primes and False otherwise.

Tried this, but does not work for all testcases, for example it should return True for 3432, it returns False.

def partition(num):
    primelist=[]
    for i in range(2,num + 1):
        for p in range(2,i):
            if (i % p) == 0:
                break
        else:
            primelist.append(i)


    for x in primelist:
        y= num-x
        for z in range(2,y):
            if y%z == 0:
                return False

        return True

Solution

  • The error lies in the second for loop. You are looping through possible primes x, and wish to then check that y = num - x is also prime.

    The error in your logic is that in the second for loop, if the first element in the loop y = num - x is not prime, it will return False, without checking any of the other possible values.

    You could correct this by moving the return False statement out one loop, but since you have already generated a list of primes less than num, primelist (and since y = num - x, (if prime y exists) it will be in this list), you can just check for membership of the list:

        for x in primelist:
            y= num-x
            # Note: num = x + y, thus need only check y prime
            if y in primelist:
                return True
            # If no such y is prime, not possible
            else:
                return False
    

    Note: I would advise making the logic of your script more modular, separating out the prime list generator into its own function:

    def partition(num):
        """
        Return True if there exist primes x,y such that num = x + y.
        Else return False.
        """
        primelist = primes(num)
        for x in primelist:
            y= num-x
            # Note: num = x + y, thus need only check y prime
            if y in primelist:
                return True
        # If no such y is prime, not possible
        else:
            return False
    
    def primes(num):
        """Return list of all primes less than num."""
        primelist=[]
        for i in range(2,num + 1):
            for p in range(2,i):
                if (i % p) == 0:
                    break
            else:
                primelist.append(i)
        return primelist