Most programming needs less math than people fear: arithmetic, basic algebra, logic, and a feel for how fast quantities grow. For coding interviews you add modulo arithmetic, a little combinatorics and Big O. Calculus, linear algebra, trigonometry and statistics matter only in specific fields such as graphics, games, machine learning and data work. You can start coding before you are “good at math”, and learn the rest when a project demands it.
What you need for almost every programmer
Arithmetic that computers do differently
You know addition and division, but code adds details that trip people up:
- Integer division and remainder.
//and%in Python give the quotient and remainder. Negative numbers are where languages differ: in Python-7 % 3is2, while in JavaScript, Java and C++ it is-1. - Floating point is approximate. Decimal fractions often cannot be stored exactly in binary.
- Integers can overflow in fixed-size types such as C++
intor Javaint(Python integers grow as needed).
import math
print(-7 % 3, -7 // 3) # 2 -3
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
print(math.isclose(0.1 + 0.2, 0.3)) # True
Never compare floats with ==; compare with a tolerance. For money, use integers (cents) or a decimal type. The Modulo Operator lesson is a quick drill for the remainder part.
Algebra: variables, functions and formulas
Programming is mostly algebra in disguise: a variable stands for a value, a function maps inputs to outputs, and you rearrange an expression to isolate what you need. A concrete skill is turning a loop into a formula. The sum of 1 to n is n * (n + 1) / 2, so a loop that adds up to 100 can be replaced by one expression:
n = 100
print(sum(range(1, n + 1))) # 5050
print(n * (n + 1) // 2) # 5050
You will use this when analysing loops and when a problem has a closed-form shortcut.
Boolean logic
Conditions are logic. You need AND, OR, NOT, and De Morgan’s laws, which let you simplify a condition: not (a and b) equals (not a) or (not b), and not (a or b) equals (not a) and (not b). A common bug is negating a compound condition wrongly when you flip an if to an early return. Check it with a truth table when unsure.
Growth rates and logarithms (Big O)
This is the most useful math for interviews. You must tell apart constant, logarithmic, linear, n log n, quadratic and exponential growth, and know what each means at real sizes. A logarithm answers “how many times can I halve this?”:
import math
print(math.log2(1_000_000)) # 19.931568569324174
print(math.ceil(math.log2(1_000_000))) # 20
A binary search over a million sorted items needs at most about 20 comparisons. A nested loop over a million items does around a trillion operations. That gap is the reason algorithms matter. For a gentle start, try the Big O lessons.
Number systems and bits
Binary, hexadecimal, and the operators &, |, ^, << and >> come up in low-level code, flags, hashing and a set of interview problems. Shifting left by k multiplies by 2k; the lowest bit tells you odd or even.
n = 13
print(bin(n)) # 0b1101
print(n & 1) # 1 (odd)
print(n >> 1) # 6 (integer divide by 2)
print(n << 2) # 52 (multiply by 4)
What you need for algorithms and interviews
Modular arithmetic and gcd
Remainders are useful whenever things wrap around: clock times, circular buffers, hash table indexes, “every k-th item”. Many problems also ask for the answer modulo 109+7 to keep numbers small. The greatest common divisor, found by Euclid’s algorithm, is short enough to write from memory:
def gcd(a, b):
while b:
a, b = b, a % b
return a
print(gcd(48, 18)) # 6
print((22 + 5) % 24) # 3 -> 5 hours after 22:00 is 03:00
Counting: permutations, combinations, subsets
You need to estimate how many possibilities a brute-force search has. n items can be ordered in n! ways, a set of n items has 2n subsets, and choosing k items from n has C(n, k) options:
import math
print(math.factorial(10)) # 3628800
print(2 ** 20) # 1048576
print(math.comb(5, 2)) # 10
print(math.perm(5, 2)) # 20
Ten items give 3.6 million orderings; twenty give 2.4 quintillion, which no loop can finish. Seeing that is how you know when backtracking needs pruning or when dynamic programming is required.
Discrete math: sets, graphs, induction, recurrences
This is the math of computer science. You deal with sets (hash sets and their operations), graphs (nodes and edges for maps, networks and dependencies), recurrences (the running time of a recursive function, such as T(n) = 2T(n/2) + n), and proof by induction, which is the same idea as writing a correct recursive function: assume it works for smaller input and show it works for the next. Our post on mathematical induction in algorithm design shows how.
Basic probability
Enough to compute simple odds and expected values, and to understand randomized algorithms and hash collisions. For example, two dice sum to 7 in 6 of 36 outcomes, so 1/6:
ways = sum(1 for a in range(1, 7) for b in range(1, 7) if a + b == 7)
print(ways, ways / 36) # 6 0.16666666666666666
What you need only in some fields
| Field | Math | What it is used for |
|---|---|---|
| Games, graphics, simulations | Geometry, vectors, trigonometry, matrices | Distances, rotation, collision, camera transforms |
| Machine learning | Linear algebra, calculus (derivatives), probability | Vectors and matrices as data, gradient-based training |
| Data analysis, A/B testing | Statistics | Mean, spread, confidence, hypothesis tests |
| Cryptography | Number theory, modular arithmetic | Primes, modular exponentiation |
| Finance, science | Numerical methods | Precision, rounding, error |
Two short examples. Distance between points is the Pythagorean theorem, and rotating a point uses sine and cosine:
import math
def dist(x1, y1, x2, y2):
return math.hypot(x2 - x1, y2 - y1)
def rotate(x, y, degrees):
t = math.radians(degrees)
return (x * math.cos(t) - y * math.sin(t),
x * math.sin(t) + y * math.cos(t))
print(dist(0, 0, 3, 4)) # 5.0
print(tuple(round(v, 6) for v in rotate(3, 4, 90))) # (-4.0, 3.0)
The unrounded rotation gives 3.0000000000000004 for the y value, another reminder about floating point, which is why the example rounds.
Mean and standard deviation (the population version, which divides by n) in the standard library:
import statistics
data = [2, 4, 4, 4, 5, 5, 7, 9]
print(statistics.mean(data), statistics.pstdev(data)) # 5 2.0
Gradient descent, which trains most machine-learning models, is calculus applied in a loop: take the derivative, step the other way. You can learn it when you start machine learning, not before.
How to learn the math without a math course
- Learn it when a problem needs it. When a task involves angles, read about trigonometry for that task. Motivation helps retention.
- Implement it. Write gcd, binomial coefficients, a prime check, matrix multiplication yourself, and test them against the standard library.
- Estimate before you run. Before executing a loop, guess how many operations it does. Check yourself with a counter.
- Use free courses for the gaps. Many universities publish discrete math and linear algebra lectures online. Khan Academy covers school-level algebra through calculus.
If your goal is interviews, the order that pays off is: modulo and basic number properties, Big O, counting, then graphs. Our post on the mathematics behind algorithm design goes deeper into this side. You can practice the pieces in code with the exercises on AlgoCademy.
Common misconceptions
- “I’m bad at math, so I can’t code.” Most code is logic and clear thinking about cases, not computation. Many working developers rarely go beyond arithmetic and Big O.
- “I need advanced math for interviews.” Not for typical software roles. Competitive programming and some quantitative or research roles do ask for more.
- “Libraries do it, so I can skip it.” Libraries do the computing, but you still decide which formula applies, what the edge cases are, and whether the result is plausible.
