The pow(base, exp[, mod]) built-in function raises a base to an exponent power, with optional high-performance modular reduction.
Modular Arithmetic & Inverses: When called with two arguments (pow(base, exp)), it performs standard exponentiation identical to the ** operator. When passed three arguments (pow(base, exp, mod)), it calculates modular exponentiation in logarithmic time without allocating huge intermediate numbers. In Python 3.8+, pow(base, -1, mod) computes the modular multiplicative inverse. For quotient and remainder calculations, see divmod(), or round decimals with round().
The pow() function accepts two or three positional arguments:
# Formal syntax of built-in pow()
# Form 1: Two-argument basic exponentiation (base ** exp)
result = pow(base, exp)
# Form 2: Three-argument modular exponentiation ((base ** exp) % mod)
mod_result = pow(base, exp, mod)
| Parameter | Type Accepted | Behavioral Details |
|---|---|---|
base |
int or float |
The base number to be raised to an exponent. |
exp |
int or float |
The exponent power. Can be positive, negative, or zero. |
mod |
int (optional) |
Modulus divisor. When provided, all three arguments must be integers, and mod != 0. |
| Return Value | int or float |
Returns the computed power. Preserves integer precision when inputs are integers. |
When called with two arguments, pow() computes standard power values. Negative exponents return fractional floats:
# 1. Positive integer exponentiation
print("pow(2, 3): ", pow(2, 3)) # 8
print("Type: ", type(pow(2, 3))) #
# 2. Floating-point base
print("pow(2.5, 3):", pow(2.5, 3)) # 15.625
# 3. Negative exponent (returns reciprocal float)
print("pow(2, -2): ", pow(2, -2)) # 0.25
Output:
pow(2, 3): 8
Type:
pow(2.5, 3): 15.625
pow(2, -2): 0.25
Calculating (base ** exp) % mod directly on large cryptographic numbers can cause memory exhaustion. The 3-argument form uses binary exponentiation at the C level, computing the modular result in O(log exp) time:
# Three-argument modular exponentiation: pow(base, exp, mod)
# Equivalent mathematically to (base ** exp) % mod
# But computed in O(log exp) time without intermediate big-integer blowup!
base = 7
exp = 256
modulus = 13
# Fast C-level modular exponentiation
result = pow(base, exp, modulus)
print(f"pow({base}, {exp}, {modulus}) =", result)
# Demonstrating speed on massive cryptographic exponents:
huge_exp = 100_000
fast_mod = pow(3, huge_exp, 1000)
print(f"Last 3 digits of 3^{huge_exp}:", fast_mod)
Output:
pow(7, 256, 13) = 9
Last 3 digits of 3^100000: 1
Starting in Python 3.8, passing -1 as the exponent computes the modular multiplicative inverse using the Extended Euclidean Algorithm:
# Modular multiplicative inverse in Python 3.8+
# Solves for x where: (a * x) % mod == 1
# Syntax: pow(a, -1, mod) requires math.gcd(a, mod) == 1
a = 3
m = 11
# Compute modular inverse
inv = pow(a, -1, m)
print(f"Inverse of {a} modulo {m}:", inv)
print(f"Verification: ({a} * {inv}) % {m} =", (a * inv) % m)
Output:
Inverse of 3 modulo 11: 4
Verification: (3 * 4) % 11 = 1
Python offers three ways to compute powers, each suited to different tasks:
| Feature | pow(x, y[, z]) (Built-in) |
x ** y (Operator) |
math.pow(x, y) (Math module) |
|---|---|---|---|
| Return Type | Preserves int when possible |
Preserves int when possible |
Always returns float |
| Modular Math (3rd arg) | Supported natively | Not supported | Not supported |
| Modular Inverse | Supported (pow(a, -1, m)) |
Not supported | Not supported |
| Best Used For | Cryptography, modular math | Everyday arithmetic in code | Floating-point numeric pipelines |
import math
# 1. pow() built-in preserves int when inputs are integers
res_builtin = pow(2, 4)
print("pow(2, 4): ", res_builtin, type(res_builtin))
# 2. Operator ** behaves identically to built-in 2-arg pow()
res_op = 2 ** 4
print("2 ** 4: ", res_op, type(res_op))
# 3. math.pow() ALWAYS returns a float
res_math = math.pow(2, 4)
print("math.pow(2, 4): ", res_math, type(res_math))
Output:
pow(2, 4): 16
2 ** 4: 16
math.pow(2, 4): 16.0
Below are common real-world algorithms demonstrating pow() in finance and cryptography:
# Recipe A: Compound interest future value
principal = 5000.0
annual_rate = 0.07
years = 5
future_value = round(principal * pow(1.0 + annual_rate, years), 2)
print("Principal: 5000.00")
print("5-Year Balance: ", future_value)
# Recipe B: Diffie-Hellman cryptographic key exchange step
# Public parameters
p = 23 # Prime modulus
g = 5 # Generator base
# Alice private key a = 6; Bob private key b = 15
alice_private = 6
bob_private = 15
# Exchange public keys: A = g^a % p, B = g^b % p
A = pow(g, alice_private, p)
B = pow(g, bob_private, p)
# Shared secret computation
alice_shared = pow(B, alice_private, p)
bob_shared = pow(A, bob_private, p)
print("Alice shared secret:", alice_shared)
print("Bob shared secret: ", bob_shared)
Output:
Principal: 5000.00
5-Year Balance: 7012.76
Alice shared secret: 2
Bob shared secret: 2
0 as the third argument raises ValueError: pow() 3rd argument cannot be 0.TypeError.pow(base, -1, mod), the base and modulus must be coprime (their greatest common divisor must be 1). Otherwise, a ValueError is raised.# Pitfall 1: Modulus cannot be 0
try:
pow(2, 3, 0)
except ValueError as err:
print("Zero modulus error:", err)
# Pitfall 2: Modulus with floats is not allowed
try:
pow(2.5, 3, 4)
except TypeError as err:
print("Float modulus error:", err)
# Pitfall 3: Inverse when numbers are not coprime
try:
pow(4, -1, 8) # gcd(4, 8) = 4 != 1
except ValueError as err:
print("Non-coprime error: ", err)
Output:
Zero modulus error: pow() 3rd argument cannot be 0
Float modulus error: pow() 3rd argument not allowed unless all arguments are integers
Non-coprime error: base is not invertible for the given modulus
Practice modular exponentiation, modular inverse calculations, and compound growth formulas in our companion Jupyter Notebook:
Explore interactive code cells, benchmark 3-argument modular pow against standard operators, implement Diffie-Hellman handshakes, and run self-validating assertions.
View on GitHub Run in Google ColabRun these unit checks directly in Python or your local environment to verify pow() mechanics:
def test_pow_mechanics():
# 1. Basic exponentiation
assert pow(2, 3) == 8
assert pow(2, -1) == 0.5
assert isinstance(pow(2, 4), int)
# 2. Modular exponentiation
assert pow(7, 256, 13) == 9
assert pow(3, 4, 5) == 1
# 3. Modular inverse (Python 3.8+)
assert pow(3, -1, 11) == 4
assert (3 * pow(3, -1, 11)) % 11 == 1
# 4. Financial compound formula
assert round(5000 * pow(1.07, 5), 2) == 7012.76
print("All pow() unit assertions passed! 100% verified.")
test_pow_mechanics()
Output:
All pow() unit assertions passed! 100% verified.
Computes integer division and remainder in a single operation.
Rounds floating-point numbers to specified precision.
Calculates the absolute magnitude of a number or complex vector.
Calculates the total sum of elements across an iterable.
Author & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.