Better buys and stronger lemonade
At a market in Lima, one stall sells 3 kg of rice for 12 soles; the next sells 5 kg for 19 soles. Which is the better buy? The second costs more in total — but you also get more rice.
Two jugs of lemonade are mixed from concentrate and water:
- jug A: 2 cups of concentrate and 3 cups of water;
- jug B: 3 cups of concentrate and 5 cups of water.
Which tastes more lemony? Jug B has one more cup of concentrate — and also two more cups of water.
And a shopkeeper raises a price by 10%, then a week later lowers it by 10%. Is it back where it started?
Each question compares quantities multiplicatively (“how many times as much?”) rather than additively (“how much more?”). That shift is what this lesson is about.
Thinking in times, not in more
Here is a classic puzzle used by researchers studying how children reason. Mr Short is 4 buttons tall. Measured with paper clips, he is 6 clips tall. His friend Mr Tall is 6 buttons tall. How many paper clips tall is Mr Tall?
A tempting answer is : “Mr Tall is 2 buttons more, so 2 clips more.” But a button and a clip are different sizes. Since 4 buttons match 6 clips, 1 button matches clips, so 6 buttons match clips. The two heights are in the same ratio whatever we measure them with: buttons-to-clips, and .
The tools of this lesson keep the multiplicative structure visible:
- a ratio table, whose rows are all scaled copies of each other;
- a double number line, with one quantity above and one below, matched at every point;
- the unit rate: how much of one quantity goes with one unit of the other.
| buttons | 2 | 4 | 6 | 8 | 1 |
|---|---|---|---|---|---|
| clips | 3 | 6 | 9 | 12 | 1.5 |
Definitions
Definition— ratio
A ratio (“ to ”) compares two quantities and . Two ratios and of positive quantities are equivalent if one is a scaled copy of the other: and for one number .
So , and are equivalent (scale factors and ), but and are not. A ratio can compare part to part (2 cups of concentrate to 3 cups of water) or part to whole (2 cups of concentrate in 5 cups of lemonade, so of the jug is concentrate). A probability with equally likely outcomes is a part-to-whole ratio too: favourable outcomes to all outcomes.
Definition— rate and unit rate
A rate is a ratio of two quantities measured in different units, such as 360 km in 4 hours. The unit rate is the amount of the first quantity per one unit of the second: km per hour.
Definition— proportional relationship
A quantity is proportional to a quantity if there is a fixed number , the constant of proportionality, with
The constant is the unit rate: the value of when .
Definition— percent
Percent means “per hundred”: means , and of is .
Worked examples
Example— The better buy
Compare unit prices: soles per kg, and soles per kg. The 5 kg bag is the better buy. (We could also compare kilograms per sol: against about . Either unit rate works, as long as we compare like with like.)
Example— The stronger lemonade
Compare the part-to-whole fractions of concentrate: jug A is concentrate, jug B is . Jug A is stronger. The ratios and are not equivalent: adding one cup of each is not scaling.
Example— Scaling a recipe
A jollof rice recipe for 4 people uses 3 cups of rice. How much for 10 people? The unit rate is cup per person, so cups. Or scale directly: people is times as many, so cups.
Example— A proportional relationship in the real world
Since 1999 the West and Central African CFA francs have had a fixed exchange rate with the euro: euro CFA francs. So the number of francs is proportional to the number of euros : . For example, euros is francs.
Example— Straight lines that are not proportional
- A taxi charges a start fee of 200 plus 150 per km: fare . Each extra kilometre adds the same amount, so the graph is a straight line — but km costs and km costs , not . The fare is not proportional to the distance.
- Amara is 5 and her brother is 8. When Amara is 10, her brother is 13, not 16: their ages differ by a constant, they are not in a constant ratio.
Example— Percentages
- of is .
- Increasing by gives .
- A price after a discount is . The original price satisfies , so . (Not of : the discount was of the original price.)
Why the methods work
Theorem— Theorem 1 (cross-multiplication)
For positive quantities, is equivalent to exactly when , that is, exactly when .
Proof
If and , then . Conversely, suppose . Let , which is positive. Then , and . So is scaled by .
∎
For the lemonade: but , so and are not equivalent.
Theorem— Theorem 2 (spotting proportionality)
is proportional to exactly when for and the ratio is the same for every . The common ratio is .
Proof
If , then when , and whenever . Conversely, if for all , then for those ; and for we are told .
∎
Theorem— Theorem 3 (the graph)
The graph of is a straight line through the origin: it contains , and the slope between any two of its points is .
Proof
gives . For two points and with , the slope is
A constant slope means the points lie on one straight line.
∎
So a proportional graph is a straight line through the origin — but, as the taxi shows, a straight line that misses the origin is not proportional. In linear relationships you will study all straight lines ; the proportional ones are exactly those with .
Theorem— Theorem 4 (ratio tables)
If is proportional, then for all and every number :
So adding two rows of a ratio table, or multiplying a row by a number, gives another correct row.
Proof
by the distributive law, and .
∎
For the taxi, adding rows fails: km () plus km () would predict for km, but the fare is — the start fee has been counted twice.
There is a converse for whole numbers. If the price of identical items is always the price of items plus the price of items, then the price of items is times the price of one: . “Combining amounts combines the costs” is exactly proportionality.
Theorem— Theorem 5 (percentage changes multiply)
A rise of multiplies an amount by , and a fall of multiplies it by . So successive changes multiply, and their order does not matter. In particular, a rise of followed by a fall of multiplies the amount by
which is less than whenever .
Proof
A rise of turns into ; similarly for a fall. Two changes multiply by both factors, and multiplication is commutative, so the order does not matter. Writing , . If then (a positive times a positive, or a negative times a negative), so .
∎
For : the factor is , so the price ends lower. The fall is of a bigger number than the rise was.
Theorem— Theorem 6 (undoing a rise)
A rise of (with ) is undone by a fall of .
Proof
∎
A rise is undone by a fall; a rise (doubling) by a fall (halving).
Proportional reasoning in Lean
We use core Lean's exact rational numbers Rat. First, equivalent ratios and cross-multiplication (Theorem 1), with the lemonade as an example. Routine algebra is closed by grind, Lean's built-in prover for the rules of arithmetic.
/-- The ratio `a : b` is *equivalent* to `c : d` if `c : d` is a scaled copy of it:
`c = k · a` and `d = k · b` for one scale factor `k > 0`. -/
def Equivalent (a b c d : Rat) : Prop := ∃ k : Rat, 0 < k ∧ c = k * a ∧ d = k * b/-- **Cross-multiplication.** For positive quantities, `a : b` is equivalent to `c : d` exactly
when `a · d = b · c`. One way: `a·(k·b) = b·(k·a)`. The other way: the scale factor is
`k = c / a`, and `a·d = b·c` gives `d = k·b`. (Only `a > 0` and `c > 0` are needed.) -/
theorem equivalent_iff_cross_mul {a b c d : Rat} (ha : 0 < a) (hc : 0 < c) :
Equivalent a b c d ↔ a * d = b * c := by
constructor
· intro ⟨k, _, hck, hdk⟩
rw [hck, hdk]
grind
· intro h
have ha0 : a ≠ 0 := Rat.ne_of_gt ha
refine ⟨c / a, ?_, ?_, ?_⟩
· rw [Rat.lt_div_iff ha]
simpa using hc
· grind
· -- From `a · d = b · c`: `d = (b · c) / a = (c / a) · b`.
grind/-- The lemonade puzzle: `2 : 3` (concentrate to water) and `3 : 5` are **not** equivalent,
because `2 · 5 = 10` but `3 · 3 = 9`. Adding one cup of each is not scaling. -/
theorem lemonade : ¬ Equivalent 2 3 3 5 := by
rw [equivalent_iff_cross_mul (by decide) (by decide)]
decide +kernelA proportional relationship is a function f with f x = k * x for one constant k. Then we prove that its graph passes through the origin, that the taxi-style line is not proportional, and Theorem 2.
/-- A relationship `y = f x` is *proportional* if there is one constant `k` (the constant of
proportionality) with `f x = k · x` for every `x`. -/
def IsProportional (f : Rat → Rat) : Prop := ∃ k : Rat, ∀ x, f x = k * x/-- A proportional relationship sends `0` to `0`: `f 0 = k · 0 = 0`. Its graph passes through
the origin. -/
theorem proportional_zero {f : Rat → Rat} (hf : IsProportional f) : f 0 = 0 := by
obtain ⟨k, hk⟩ := hf
rw [hk, Rat.mul_zero]/-- `y = 2x + 1` is a straight line but **not** proportional: it gives `1`, not `0`, at `x = 0`. -/
theorem affine_not_proportional : ¬ IsProportional (fun x => 2 * x + 1) := by
intro hf
have h0 := proportional_zero hf
grind/-- **Spotting proportionality in a table.** `f` is proportional exactly when `f 0 = 0` and the
ratio `f x / x` is the same for every `x ≠ 0`. Then `k = f 1`, and `f x / x = f 1` gives
`f x = f 1 · x`. -/
theorem proportional_iff_ratio_const (f : Rat → Rat) :
IsProportional f ↔ f 0 = 0 ∧ ∀ x, x ≠ 0 → f x / x = f 1 := by
constructor
· intro hf
refine ⟨proportional_zero hf, ?_⟩
obtain ⟨k, hk⟩ := hf
intro x hx
rw [hk x, hk 1]
grind
· intro ⟨h0, hratio⟩
refine ⟨f 1, ?_⟩
intro x
by_cases hx : x = 0
· rw [hx, h0, Rat.mul_zero]
· have h := hratio x hx
grindTheorem 3 (constant slope) and Theorem 4 (ratio tables), with the whole-number converse proved by induction:
/-- **The graph is a straight line through the origin.** Between any two different points of
the graph of `y = k · x`, the slope `(y₂ - y₁)/(x₂ - x₁)` is the same number `k`. -/
theorem slope_const (k x₁ x₂ : Rat) (h : x₁ ≠ x₂) :
(k * x₂ - k * x₁) / (x₂ - x₁) = k := by
have hne : x₂ - x₁ ≠ 0 := by
intro h0
apply h
grind
grind/-- **Adding rows of a ratio table.** If `f` is proportional, then
`f (x + y) = k·(x + y) = k·x + k·y = f x + f y`. -/
theorem proportional_add {f : Rat → Rat} (hf : IsProportional f) (x y : Rat) :
f (x + y) = f x + f y := by
obtain ⟨k, hk⟩ := hf
rw [hk, hk x, hk y, Rat.mul_add]/-- **Scaling a row of a ratio table.** If `f` is proportional, then `f (c · x) = c · f x`. -/
theorem proportional_scale {f : Rat → Rat} (hf : IsProportional f) (c x : Rat) :
f (c * x) = c * f x := by
obtain ⟨k, hk⟩ := hf
rw [hk, hk x]
grind/-- **Additive implies proportional (for whole numbers).** If the price of `m + n` items is
always the price of `m` items plus the price of `n` items, then the price of `n` items is
`n` times the price of one: `f n = n · f 1`. Proof by induction on `n`. -/
theorem additive_nat (f : Nat → Rat) (hadd : ∀ m n, f (m + n) = f m + f n) :
∀ n : Nat, f n = n * f 1 := by
have h0 : f 0 = 0 := by
have h := hadd 0 0
simp at h
grind
intro n
induction n with
| zero => simp [h0]
| succ n ih =>
rw [hadd n 1, ih]
push_cast
grindPercentages (Theorems 5 and 6):
/-- `p` percent of `x` is `p/100` of `x`. -/
def percentOf (p x : Rat) : Rat := p / 100 * x/-- Increasing `x` by `p` percent multiplies it by `1 + p/100`:
`x + (p/100)·x = (1 + p/100)·x`. -/
theorem increase_by_percent (p x : Rat) : x + percentOf p x = (1 + p / 100) * x := by
unfold percentOf
grind/-- Successive percentage changes **multiply**, so their order does not matter: a rise of `p`%
then a rise of `q`% gives the same result as `q`% then `p`%. -/
theorem successive_changes_commute (x p q : Rat) :
x * (1 + p / 100) * (1 + q / 100) = x * (1 + q / 100) * (1 + p / 100) := by
grind/-- A 10% rise followed by a 10% fall multiplies by `1.1 × 0.9 = 0.99`: you end 1% lower. -/
theorem ten_up_ten_down (x : Rat) : x * (110 / 100) * (90 / 100) = 99 / 100 * x := by
grind/-- Up by a fraction `r`, then down by the same fraction `r`: the overall factor is
`(1 + r)(1 - r) = 1 - r²`. -/
theorem up_down_factor (x r : Rat) : x * (1 + r) * (1 - r) = x * (1 - r * r) := by
grind/-- **Up and down by the same percentage never gets you back.** For a positive amount `x` and
any non-zero change `r`, rising by `r` and then falling by `r` leaves less than `x`:
`x · (1 - r²) = x - x·r² < x`. -/
theorem up_down_lt {x r : Rat} (hx : 0 < x) (hr : r ≠ 0) : x * (1 + r) * (1 - r) < x := by
rw [up_down_factor]
have hxr : 0 < x * (r * r) := Rat.mul_pos hx (sq_pos hr)
grind/-- **Undoing a percentage rise.** A rise of `p`% is undone by a fall of `100p/(100 + p)`%, not
of `p`%: `(1 + p/100) · (1 - p/(100 + p)) = 1`. For `p = 25` the fall is `20`%. -/
theorem undo_increase (p : Rat) (hp : 0 ≤ p) : (1 + p / 100) * (1 - p / (100 + p)) = 1 := by
have hpos : (0 : Rat) < 100 + p := by
have : (0 : Rat) < 100 := by decide
grind
have hne : (100 : Rat) + p ≠ 0 := Rat.ne_of_gt hpos
grindAll of these are proved here from the rules of arithmetic for Rat; none simply quotes a library theorem about proportions. In Mathlib, a proportional relationship is a linear map from to , and every such map is multiplication by a constant.
Classifying tables and multiplying percentages
"""Is this table proportional? A classifier that uses exact fractions.
A table of pairs (x, y) comes from a proportional relationship y = kx when
every row with x != 0 has the same ratio y/x and every row with x = 0 has
y = 0. It comes from a straight line when the slope between consecutive rows
is constant. The experiment classifies six real-world tables, then shows the
practical difference: in a proportional table you may add two rows to get a
third, and in a merely linear table you may not.
"""
from fractions import Fraction
TABLES = {
"millet flour (people, cups)": [(4, 6), (6, 9), (10, 15), (14, 21)],
"euros to CFA francs": [(1, "655.957"), (20, "13119.14"),
(50, "32797.85")],
"taxi (km, fare)": [(1, 350), (2, 500), (5, 950), (8, 1400)],
"square (side, perimeter)": [(1, 4), (2, 8), (5, 20)],
"square (side, area)": [(1, 1), (2, 4), (3, 9), (5, 25)],
"ages (Amara, brother)": [(5, 8), (10, 13), (20, 23)],
}
def as_pairs(table):
"""Convert table entries to exact Fractions (strings allowed)."""
return [(Fraction(x), Fraction(y)) for x, y in table]
def constant_of_proportionality(table):
"""Return k if y = k*x for every row, else None."""
pairs = as_pairs(table)
ratios = {y / x for x, y in pairs if x != 0}
if len(ratios) != 1 or any(y != 0 for x, y in pairs if x == 0):
return None
return ratios.pop()
def is_linear(table):
"""True if the slopes between consecutive rows (sorted by x) agree."""
pairs = sorted(as_pairs(table))
slopes = {(y2 - y1) / (x2 - x1)
for (x1, y1), (x2, y2) in zip(pairs, pairs[1:])}
return len(slopes) <= 1
def classify(table):
"""'proportional', 'linear, not proportional' or 'not linear'."""
if constant_of_proportionality(table) is not None:
return "proportional"
if is_linear(table):
return "linear, not proportional"
return "not linear"
def add_rows(table, i, j):
"""Add rows i and j of a table: (x_i + x_j, y_i + y_j)."""
pairs = as_pairs(table)
return pairs[i][0] + pairs[j][0], pairs[i][1] + pairs[j][1]
def taxi_fare(km):
"""The rule behind the taxi table: 200 to start, 150 per km."""
return 200 + 150 * Fraction(km)
def main():
print(f"{'table':<29}{'classification':<26}k = y/x")
for name, table in TABLES.items():
k = constant_of_proportionality(table)
shown = "-" if k is None else (
str(k) if k.denominator == 1 else f"{float(k):g}")
print(f"{name:<29}{classify(table):<26}{shown}")
print()
print("Adding two rows of a table:")
x, y = add_rows(TABLES["millet flour (people, cups)"], 0, 1)
print(f" flour: 4 people + 6 people -> {x} people need {y} cups;")
print(f" the rule y = 3x/2 gives {Fraction(3, 2) * x}: it works.")
x, y = add_rows(TABLES["taxi (km, fare)"], 0, 1)
print(f" taxi: 1 km + 2 km -> adding fares predicts {y} for {x} km,")
print(f" but the real fare is {taxi_fare(x)}: the start fee of")
print(" 200 was counted twice.")
print()
print("Epistemic status: exact arithmetic on the rows shown. A table only")
print("samples a relationship: these checks cannot see what happens")
print("between or beyond the rows. Knowing the rule (y = kx) is what")
print("makes a relationship proportional.")
if __name__ == "__main__":
main()"""Percentage changes multiply: exact arithmetic with fractions.
A rise of p% multiplies an amount by 1 + p/100 and a fall of p% by
1 - p/100. So "up p%, then down p%" multiplies by (1 + p/100)(1 - p/100),
which is 1 - (p/100)**2: always a little less than 1. This experiment
computes these factors exactly with Python's Fraction type, searches for the
pairs of changes where simply adding the percentages happens to work, finds
the fall that undoes a rise (100p/(100 + p) percent), and compares five 10%
rises with one 50% rise.
"""
from fractions import Fraction
def factor(p):
"""The multiplier for a change of p percent (p may be negative)."""
return 1 + Fraction(p) / 100
def combined(*changes):
"""The single multiplier equivalent to several percentage changes."""
total = Fraction(1)
for p in changes:
total *= factor(p)
return total
def as_percent_change(multiplier):
"""Turn a multiplier such as 99/100 into a percentage change (-1)."""
return (Fraction(multiplier) - 1) * 100
def undo_rise(p):
"""The percentage fall that exactly undoes a rise of p percent."""
p = Fraction(p)
if p <= -100:
raise ValueError("a fall of 100% or more cannot be undone")
return 100 * p / (100 + p)
def when_adding_works(low, high):
"""Whole-number pairs (p, q) in range where adding the percentages works.
Adding guesses the multiplier 1 + (p + q)/100; the true multiplier is
(1 + p/100)(1 + q/100) = 1 + (p + q)/100 + pq/10000. Returns the list of
pairs where the guess is exactly right, and the number of pairs tried.
"""
hits = []
tried = 0
for p in range(low, high + 1):
for q in range(low, high + 1):
tried += 1
if combined(p, q) == factor(p + q):
hits.append((p, q))
return hits, tried
def fmt(x):
"""Show a Fraction as a decimal when it is one, else as a fraction."""
x = Fraction(x)
if x.denominator == 1:
return str(x.numerator)
if all(p in (2, 5) for p in _prime_factors(x.denominator)):
return f"{float(x):.6f}".rstrip("0")
return f"{x} (about {float(x):.2f})"
def _prime_factors(n):
"""Prime factors of n > 0 (with repetition)."""
out, d = [], 2
while d * d <= n:
while n % d == 0:
out.append(d)
n //= d
d += 1
if n > 1:
out.append(n)
return out
def main():
print("Up p% then down p%: multiplier (1 + p/100)(1 - p/100)")
print(" p multiplier overall change")
for p in [5, 10, 20, 25, 50, 100]:
m = combined(p, -p)
print(f" {p:3d}% {fmt(m):>10} {fmt(as_percent_change(m)):>8}%")
hits, tried = when_adding_works(-99, 100)
zero = all(p == 0 or q == 0 for p, q in hits)
print(f"Adding p% and q% gives the right answer for {len(hits)} of "
f"{tried} pairs")
print(f" (whole p, q in -99..100); every one has p = 0 or q = 0: {zero}")
print()
print("The fall that undoes a rise of p%:")
for p in [10, 25, 50, 100, 300]:
print(f" rise {p:3d}% -> fall {fmt(undo_rise(p))}%")
print()
five = combined(10, 10, 10, 10, 10)
print(f"Five rises of 10%: multiplier {fmt(five)}, "
f"a rise of {fmt(as_percent_change(five))}%, not 50%.")
print()
print("Epistemic status: exact rational arithmetic. The search is")
print("exhaustive for 40,000 whole-number pairs only; that adding works")
print("exactly when pq = 0, for every p and q, follows from the algebra")
print("(1 + p/100)(1 + q/100) = 1 + (p + q)/100 + pq/10000 in the lesson.")
if __name__ == "__main__":
main()Adding percentages works only when one of the changes is : the exact algebra shows the extra term is zero only then. The search is evidence for 40,000 pairs; the algebra is the proof for all of them.
Explore: double number lines and lines through the origin
Double number line
3 kg for 12 soles. Find the unit rate, then the price of 5 kg.
3
kilograms of rice
:
12
soles
3 : 12 = 3 : 12 (× 1)
This is the starting ratio.
Unit rates
- 1 : 4 — For every 1 on the “kilograms of rice” line: 4 on the “soles” line.
- 0.25 : 1 — For every 1 on the “soles” line: 0.25 on the “kilograms of rice” line.
Equivalent ratios
3 : 12 = 6 : 24 = 9 : 36 = 12 : 48 = …
Divide both by 3 for the simplest form: 1 : 4
| × | kilograms of rice | soles |
|---|---|---|
| 0 | 0 | 0 |
| 1/3 | 1 | 4 |
| 1 | 3 | 12 |
| 2 | 6 | 24 |
| 3 | 9 | 36 |
| 4 | 12 | 48 |
| 5 | 15 | 60 |
| 6 | 18 | 72 |
Move the marker to kg to read the unit rate, then to kg. The stall that sells 5 kg for 19 soles is cheaper by how much?
Which line is proportional?
Move the sliders and trace along the curves to read off values.
- y = kx (proportional)
- y = kx + b
- y = kx (proportional): y = 1.5
- y = kx + b: y = 3.5
Change : the first line always pivots about the origin. Change : the second line slides up and down, and is proportional only when . Use the trace to check that, on the first line, is the same at every point — and on the second line it is not.
Exercises
1. Ratios, rates and proportional reasoning
Warm-upHumanPackets of tea in a shop in Kampala: a g packet costs shillings and a g packet costs shillings. Which is the better buy?
2. Ratios, rates and proportional reasoning
Warm-upHumanA recipe for people uses cups of millet flour. How many cups are needed for people?
3. Ratios, rates and proportional reasoning
CoreHumanMr Short is buttons tall and paper clips tall. Mr Tall is buttons tall. How many paper clips tall is Mr Tall?
4. Ratios, rates and proportional reasoning
CoreHumanWhich of these relationships are proportional? (Choose all that apply.)
5. Ratios, rates and proportional reasoning
CoreHumanIn a proportional relationship, when , and when . What is when ?
6. Ratios, rates and proportional reasoning
CoreHumanA bicycle costs dollars. The price rises by , and the next month the new price falls by . What is the final price, in dollars?
7. Ratios, rates and proportional reasoning
CoreHumanIn a sale everything is off. A jacket now costs reais. What was its price before the sale?
8. Ratios, rates and proportional reasoning
StretchHumanThe population of a town rises by . By what percentage must it then fall to return to its original size?
9. Ratios, rates and proportional reasoning
CoreFormalWhich Lean definition says correctly that is proportional (there is one constant with for every )?
10. Ratios, rates and proportional reasoning
StretchComputationalWrite constant_of_proportionality(table). The table is a list of pairs (x, y). Return the constant (as a Fraction) if for every row, and None otherwise. Rows with x == 0 must have y == 0, and there must be at least one row with x != 0. Use Fraction so that decimals such as \"0.5\" are exact.
Common misconceptions
Misconception
Thinking additively instead of multiplicatively. “Mr Tall is 2 buttons taller, so he is 2 clips taller” gives clips instead of . When two quantities are proportional, ask “how many times as much?”, not “how much more?”.
Misconception
“Every straight-line graph is proportional.” is a straight line, but doubling does not double , and the line misses the origin. Proportional means : a straight line through the origin.
Misconception
Adding successive percentage changes. A rise and a fall do not cancel (the result is lower), and five rises make , not . Percentage changes multiply.
Misconception
Mixing up part-to-part and part-to-whole. In a mix of concentrate to water, concentrate is of the jug, not .
Misconception
Confusing percent with percentage points. If an interest rate rises from to , it rises by percentage point — which is a increase in the rate.
Other ways of seeing
Geometry— Proportion is similarity
Two figures are similar when one is a scaled copy of the other: all lengths are multiplied by the same factor , so corresponding lengths are in the same ratio. A map at scale is similar to the land it shows; the shadows of a pole and of a tree at the same moment form similar triangles, which lets you measure the tree. Thales' intercept theorem says that parallel lines cut two lines through a point in proportional pieces. Similar triangles also explain Theorem 3 geometrically: the points all make similar right triangles with the -axis, so they lie on one straight line through the origin. See rigid motions and similarity.
Physics— Laws of proportion — within limits
Many physical laws are proportionalities: distance speed time at a steady speed; the stretch of a spring is proportional to the force on it (Hooke's law); the current through many conductors is proportional to the voltage (Ohm's law). A rate carries units — km per hour, newtons per metre — and checking units is a powerful way to catch errors. But such laws are models, true only within limits: stretch a spring too far and Hooke's law fails. Physics discovers proportionalities by measurement; mathematics tells us what follows if they hold.
Algebra— Proportional relationships are linear maps
A proportional relationship is exactly a function that respects addition and scaling (Theorem 4): an algebraist calls it a linear map. Composing two of them multiplies the constants: converting euros to CFA francs () and then francs to some other currency () is again proportional, with constant . That is why chains of unit conversions work. In functions and later in linear algebra this idea grows into matrices.
History and global context
- China. The Nine Chapters on the Mathematical Art (compiled by about the 1st century CE) has a chapter on exchanging one grain for another at fixed rates, and a chapter on distributing goods and taxes in proportion.
- India. The rule of three (trairāśika) — given three quantities of a proportion, find the fourth — appears in Āryabhaṭa's Āryabhaṭīya (499 CE) and was used throughout Indian mathematics.
- Greece. Book V of Euclid's Elements (about 300 BCE) develops a general theory of ratio and proportion, traditionally credited to Eudoxus of Cnidus, which even works for lengths that have no common measure.
- Trade. Through mathematicians writing in Arabic, the rule of three reached Europe; Fibonacci's Liber Abaci (1202) uses it for currency exchange and partnership problems. Percentages grew out of merchants' “per hundred” calculations; the Roman emperor Augustus had already levied a tax of one hundredth on goods sold at auction.
- Learning. Robert Karplus and colleagues used the “Mr Short and Mr Tall” problem in the 1970s to study how students move from additive to multiplicative reasoning — a transition researchers still study today.
Further reading
- Susan J. Lamon, Teaching Fractions and Ratios for Understanding (1999).
- Hans Freudenthal, Didactical Phenomenology of Mathematical Structures (1983), chapter “Ratio and proportionality”.
- Richard Lesh, Thomas Post and Merlyn Behr, “Proportional reasoning”, in J. Hiebert and M. Behr (eds.), Number Concepts and Operations in the Middle Grades (1988).
- Euclid, The Elements, Book V, in the translation by T. L. Heath (1908).