Open In App

Prime Factor Program

Last Updated : 14 Jul, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Given an integer n, find all unique prime factors of n. A prime factor is a prime number that divides n exactly (without leaving a remainder).

Examples:

Input: n = 100
Output: [2, 5]
Explanation: Unique prime factors of 100 are 2 and 5.
Input: n = 60
Output: [2, 3, 5]
Explanation: Prime factors of 60 are 2, 2, 3, 5. Unique prime factors are 2, 3 and 5.

[Approach 1] Factorization using Trial Division - O(sqrt(n)) Time and O(log(n)) Space

First, divide n by 2 repeatedly and store 2 as a unique prime factor if it divides n. Then, check odd numbers from 3 to √n, for each that divides n, store it and divide n completely by it. Finally, if n is still greater than 2, store it as it is a prime factor.

Step by step approach:

  • Start by checking if n is divisible by 2.
    • If yes, store 2 as a unique prime factor and divide n repeatedly by 2.
  • Loop through odd numbers i from 3 to √n:
    • If i divides n, store i as a unique prime factor.
    • Keep dividing n by i until it's no longer divisible.
  • After the loop, if n > 2, it is a prime and should be stored.
  • This ensures all unique prime factors are captured efficiently.
  • The algorithm avoids duplicates by fully removing each prime factor once found.
C++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

vector<int> primeFac(int n) {
    vector<int> res;

    // Check for factor 2
    if (n % 2 == 0) {
        res.push_back(2);
        while (n % 2 == 0) n /= 2;
    }

    // Check for odd prime factors
    for (int i = 3; i <= sqrt(n); i += 2) {
        if (n % i == 0) {
            res.push_back(i);
            while (n % i == 0) n /= i;
        }
    }

    // If remaining n is a prime number > 2
    if (n > 2) res.push_back(n);

    return res;
}

int main() {
    int n = 100;
    vector<int> result = primeFac(n);
    for (int factor : result) {
        cout << factor << " ";
    }
    return 0;
}
Java
import java.util.*;

public class GfG {

    public static ArrayList<Integer> primeFac(int n) {
        ArrayList<Integer> res = new ArrayList<>();

        // Check for factor 2
        if (n % 2 == 0) {
            res.add(2);
            while (n % 2 == 0) {
                n /= 2;
            }
        }

        // Check for odd prime factors
        for (int i = 3; i <= Math.sqrt(n); i += 2) {
            if (n % i == 0) {
                res.add(i);
                while (n % i == 0) {
                    n /= i;
                }
            }
        }

        // If remaining n is a prime number > 2
        if (n > 2) {
            res.add(n);
        }

        return res;
    }

    public static void main(String[] args) {
        int n = 100;
        ArrayList<Integer> result = primeFac(n);

        for (int factor : result) {
            System.out.print(factor + " ");
        }
    }
}
Python
import math

def primeFac(n):
    res = []

    # Check for factor 2
    if n % 2 == 0:
        res.append(2)
        while n % 2 == 0:
            n //= 2

    # Check for odd prime factors
    i = 3
    while i * i <= n:
        if n % i == 0:
            res.append(i)
            while n % i == 0:
                n //= i
        i += 2

    # If n is a prime > 2
    if n > 2:
        res.append(n)

    return res

# Driver code
if __name__ == "__main__":
    n = 100
    result = primeFac(n)
    print(" ".join(map(str, result)))
C#
using System;
using System.Collections.Generic;

class GfG
{
    public static List<int> primeFac(int n)
    {
        List<int> res = new List<int>();

        // Check for factor 2
        if (n % 2 == 0)
        {
            res.Add(2);
            while (n % 2 == 0)
                n /= 2;
        }

        // Check for odd prime factors
        for (int i = 3; i <= Math.Sqrt(n); i += 2)
        {
            if (n % i == 0)
            {
                res.Add(i);
                while (n % i == 0)
                    n /= i;
            }
        }

        // If n is a prime number > 2
        if (n > 2)
            res.Add(n);

        return res;
    }

    public static void Main()
    {
        int n = 100;
        List<int> result = primeFac(n);
        Console.WriteLine(string.Join(" ", result));
    }
}
JavaScript
function primeFac(n) {
    const res = [];

    // Check for factor 2
    if (n % 2 === 0) {
        res.push(2);
        while (n % 2 === 0) {
            n = Math.floor(n / 2);
        }
    }

    // Check for odd prime factors
    for (let i = 3; i <= Math.sqrt(n); i += 2) {
        if (n % i === 0) {
            res.push(i);
            while (n % i === 0) {
                n = Math.floor(n / i);
            }
        }
    }

    // If n is a prime > 2
    if (n > 2) {
        res.push(n);
    }

    return res;
}

const n = 100;
const result = primeFac(n);
console.log(result.join(" "));

Output
2 5 

[Approach 2] Sieve of Eratosthenes (Smallest Prime Factor)

The idea in the SPF approach is to precompute the smallest prime factor (SPF) for every number up to n using a modified sieve. Once SPF is ready, we can efficiently find the unique prime factors of any number by repeatedly dividing it by its SPF. This makes each factorization run in O(log n) time.

Note: This approach is best for cases where we need to find unique prime factors for multiple input values.

Step by step approach:

  • Precompute spf for every number up to n:
    • Create an array spf[] of size n+1, where spf[i] stores the smallest prime factor of i.
    • Initialize spf[i] = i for all i.
    • Use the Sieve of Eratosthenes, for each prime i, mark spf[j] = i for all multiples j of i (if not already marked).
  • To find unique prime factors of a number n:
    • Repeatedly divide n by spf[n] (i.e n = n/spf[n]).
    • Store each new spf[n] encountered in a set (to keep it unique and in ascending order).
    • Continue until n becomes 1.
C++
#include <iostream>
#include <vector>
#include <set>
using namespace std;

// Function to compute SPF (Smallest Prime Factor) for every number up to N
vector<int> computeSPF(int N) {
    vector<int> spf(N + 1);
    for (int i = 0; i <= N; ++i) {
        spf[i] = i;
    }

    for (int i = 2; i * i <= N; ++i) {
        // i is prime
        if (spf[i] == i) { 
            for (int j = i * i; j <= N; j += i) {
                if (spf[j] == j) {
                    spf[j] = i;
                }
            }
        }
    }
    return spf;
}

// Function to get unique prime factors using precomputed SPF
vector<int> primeFac(int n, const vector<int>& spf) {
    set<int> uniqueFactors;
    while (n > 1) {
        uniqueFactors.insert(spf[n]);
        n /= spf[n];
    }
    return vector<int>(uniqueFactors.begin(), uniqueFactors.end());
}

int main() {
    
    int n = 100;
    vector<int> spf = computeSPF(n);
    vector<int> result = primeFac(n, spf);
    for (int factor : result) {
        cout << factor << " ";
    }
    cout << endl;
    return 0;
}
Java
import java.util.*;

public class GfG {
    // Function to compute SPF (Smallest Prime Factor)
    public static int[] computeSPF(int n) {
        int[] spf = new int[n + 1];
        for (int i = 0; i <= n; i++) {
            spf[i] = i;
        }

        for (int i = 2; i * i <= n; i++) {
            if (spf[i] == i) {
                for (int j = i * i; j <= n; j += i) {
                    if (spf[j] == j) {
                        spf[j] = i;
                    }
                }
            }
        }
        return spf;
    }

    // Function to get unique prime factors using SPF
    public static ArrayList<Integer> primeFac(int n, int[] spf) {
        Set<Integer> unique = new HashSet<>();
        // finding unique prime factor
        while (n > 1) {
            unique.add(spf[n]);
            n /= spf[n];
        }
        ArrayList<Integer> result = new ArrayList<>(unique);
        Collections.sort(result); 
        return result;
    }

    public static void main(String[] args) {
        int n = 100;
        int[] spf = computeSPF(n);
        ArrayList<Integer> result = primeFac(n, spf);
        for (int x : result) {
            System.out.print(x + " ");
        }
    }
}
Python
import math

# Function to compute SPF (Smallest Prime Factor) up to N
def compute_spf(N):
    spf = [i for i in range(N + 1)]
    
    for i in range(2, int(math.sqrt(N)) + 1):
        if spf[i] == i:  # i is prime
            for j in range(i * i, N + 1, i):
                if spf[j] == j:
                    spf[j] = i
    return spf

# Function to get unique prime factors using precomputed SPF
def prime_factors(n, spf):
    unique_factors = set()
    while n > 1:
        unique_factors.add(spf[n])
        n //= spf[n]
    return sorted(unique_factors)

# Driver code
if __name__ == "__main__":
    n = 100
    spf = compute_spf(n)
    result = prime_factors(n, spf)
    print(" ".join(map(str, result)))
C#
using System;
using System.Collections.Generic;

class GfG
{
    // Function to compute SPF (Smallest Prime Factor) for every number up to N
    static int[] computeSPF(int N)
    {
        int[] spf = new int[N + 1];

        for (int i = 0; i <= N; i++)
        {
            spf[i] = i;
        }

        for (int i = 2; i * i <= N; i++)
        {
            if (spf[i] == i) // i is prime
            {
                for (int j = i * i; j <= N; j += i)
                {
                    if (spf[j] == j)
                    {
                        spf[j] = i;
                    }
                }
            }
        }

        return spf;
    }

    // Function to get unique prime factors using precomputed SPF
    static List<int> primeFac(int n, int[] spf)
    {
        HashSet<int> uniqueFactors = new HashSet<int>();

        while (n > 1)
        {
            uniqueFactors.Add(spf[n]);
            n /= spf[n];
        }

        List<int> result = new List<int>(uniqueFactors);
        result.Sort(); // Optional: to keep factors in ascending order
        return result;
    }

    static void Main()
    {
        int n = 100;
        int[] spf = computeSPF(n);
        List<int> result = primeFac(n, spf);

        Console.WriteLine(string.Join(" ", result));
    }
}
JavaScript
// Function to compute SPF (Smallest Prime Factor) up to N
function computeSPF(N) {
    const spf = Array.from({ length: N + 1 }, (_, i) => i);

    for (let i = 2; i * i <= N; i++) {
        if (spf[i] === i) { // i is prime
            for (let j = i * i; j <= N; j += i) {
                if (spf[j] === j) {
                    spf[j] = i;
                }
            }
        }
    }

    return spf;
}

// Function to get unique prime factors using precomputed SPF
function primeFac(n, spf) {
    const uniqueFactors = new Set();

    while (n > 1) {
        uniqueFactors.add(spf[n]);
        n = Math.floor(n / spf[n]);
    }

    return Array.from(uniqueFactors).sort((a, b) => a - b); // Optional sort
}

// Driver code
const n = 100;
const spf = computeSPF(n);
const result = primeFac(n, spf);

console.log(result.join(" "));

Output
2 5 

Time Complexity: O(n*log(log(n))) - The SPF array is built in O(n(log(log(n))) time using the sieve. Then, finding the unique prime factors of a single number n takes O(log(n)) time.
Auxiliary Space: O(n) - The algorithm uses O(n) space for the SPF array, which stores the smallest prime factor for each number up to n.

Practice problems for finding prime factors  



Article Tags :
Practice Tags :

Similar Reads