Prime Factorization: Trial Division and Pollard's Rho
Advertisement
Prime Factorization
Trial Division O(sqrt n)
For each p from 2 to sqrt(n):
while n divisible by p:
add p to factors
n //= p
if n > 1: n is a prime factor
C Implementation
#include <stdio.h>
#include <math.h>
void factorize(long long n) {
printf("%lld = ", n);
for (long long p = 2; p * p <= n; p++) {
if (n % p == 0) {
int exp = 0;
while (n % p == 0) { exp++; n /= p; }
printf("%lld^%d ", p, exp);
}
}
if (n > 1) printf("%lld^1", n);
printf("\n");
}
Python Implementation
def factorize(n):
factors = {}
p = 2
while p * p <= n:
while n % p == 0:
factors[p] = factors.get(p, 0) + 1
n //= p
p += 1
if n > 1:
factors[n] = factors.get(n, 0) + 1
return factors
def count_divisors(n):
factors = factorize(n)
result = 1
for exp in factors.values():
result *= (exp + 1)
return result
def sum_divisors(n):
factors = factorize(n)
result = 1
for p, e in factors.items():
result *= (p**(e+1) - 1) // (p - 1)
return result
print(factorize(360)) # {2: 3, 3: 2, 5: 1} = 2^3 * 3^2 * 5
print(count_divisors(360)) # 24
C++ Implementation
#include <bits/stdc++.h>
using namespace std;
map<long long, int> factorize(long long n) {
map<long long, int> factors;
for (long long p = 2; p * p <= n; p++) {
while (n % p == 0) {
factors[p]++;
n /= p;
}
}
if (n > 1) factors[n]++;
return factors;
}
// Count divisors using SPF sieve
vector<int> buildSPF(int n) {
vector<int> spf(n + 1);
iota(spf.begin(), spf.end(), 0);
for (int p = 2; p * p <= n; p++) {
if (spf[p] == p) {
for (int m = p * p; m <= n; m += p)
if (spf[m] == m) spf[m] = p;
}
}
return spf;
}
map<int,int> fastFactorize(int n, vector<int>& spf) {
map<int,int> factors;
while (n > 1) {
factors[spf[n]]++;
n /= spf[n];
}
return factors;
}
Java Implementation
import java.util.*;
public class PrimeFactors {
public static Map<Long, Integer> factorize(long n) {
Map<Long, Integer> factors = new LinkedHashMap<>();
for (long p = 2; p * p <= n; p++) {
while (n % p == 0) {
factors.merge(p, 1, Integer::sum);
n /= p;
}
}
if (n > 1) factors.put(n, 1);
return factors;
}
public static long countDivisors(long n) {
long count = 1;
for (Map.Entry<Long, Integer> e : factorize(n).entrySet())
count *= (e.getValue() + 1);
return count;
}
}
JavaScript Implementation
function factorize(n) {
const factors = new Map();
for (let p = 2; p * p <= n; p++) {
while (n % p === 0) {
factors.set(p, (factors.get(p) || 0) + 1);
n = Math.floor(n / p);
}
}
if (n > 1) factors.set(n, (factors.get(n) || 0) + 1);
return factors;
}
Key Formulas
- Number of divisors: Product of (e_i + 1) for each prime p_i^e_i
- Sum of divisors: Product of (p_i^(e_i+1) - 1) / (p_i - 1)
- Euler's totient: phi(n) = n * product((1 - 1/p)) for each prime p dividing n
Complexity
- Trial division: O(sqrt n)
- With SPF sieve: O(n log log n) build, O(log n) per factorization
Advertisement