How GPS Actually Works | Oh My Kode

How GPS Actually Works

12 Jun 2020

38 minutes read

Your phone knows where it is to within a few metres, and the usual one-line explanation — “it triangulates from satellites” — is wrong in an interesting way. Nothing is triangulated : no angle is measured anywhere in the system. What actually happens is stranger and better. Four atomic clocks, twenty thousand kilometres up, broadcast the time. Your phone listens, realises its own cheap quartz clock cannot be trusted, and then solves for where it is and what time it is at the same moment. And none of it would work at all without both of Einstein’s theories : left uncorrected, relativity would put your position out by eleven kilometres a day. This post builds the whole thing, from one distance measurement to why the satellites’ clocks were deliberately built to run at the wrong speed.

PART I — THE IDEA
distance from time, and the trick with the fourth satellite

1. Distance is just a stopwatch

Everything rests on one fact : radio waves travel at a known, fixed speed. If a satellite stamps a signal with the exact moment it left, and you note the exact moment it arrived, then

\[\begin{equation} d = c \cdot \Delta t, \qquad c = 299\,792\,458 \text{ m/s}. \label{eq:range} \end{equation}\]

That is the entire measurement. There is no radar, no echo, no angle — just a one-way trip and a subtraction.

Now look at what that speed means for the engineering, because it is the number that governs the whole design :

\[c \times 1\text{ ns} = 29.98 \text{ cm}.\]

In plain words : light crosses a ruler’s width in a nanosecond. So to know your position to within a metre, you must know the travel time to within three nanoseconds. Every difficulty in this post — atomic clocks, relativity, the atmosphere — is a consequence of that single requirement.

leaves at t₁ stamped by an atomic clock arrives at t₂ measured by your phone d = c · (t₂ − t₁) one nanosecond of light 29.98 cm so a metre of accuracy costs three nanoseconds of timing — that is the whole engineering problem
Figure 1 - The entire measurement. The satellite stamps the moment of transmission with an atomic clock ; the receiver notes the moment of arrival ; the difference times the speed of light is the distance. Nothing else is measured — no angle, no echo. The orange bar is what makes it hard : light covers only thirty centimetres in a nanosecond.

2. Spheres, not triangles

Suppose for a moment that you do have a perfect clock. One satellite tells you it is 20,300 km away — so you are somewhere on a sphere of that radius around it. That is a lot of possible places.

Add a second satellite and you are on the intersection of two spheres, which is a circle. Add a third and you are down to two points, one of which is almost always absurd — deep inside the Earth, or far out in space moving at an impossible speed — so it is discarded.

one satellite somewhere on this circle two satellites down to two points you three satellites one point — the other is absurd
Figure 2 - Trilateration, drawn in the plane. Each range puts you on a circle around its satellite ; two circles leave two candidates ; three pin you down. In three dimensions every step gives one dimension more — one sphere, then a circle, then two points, of which one is always somewhere ridiculous and gets discarded. No angle is measured anywhere, which is why "triangulation" is the wrong word.
The popular word for this is triangulation, and it is the wrong word. Triangulation means measuring angles to known landmarks, as a surveyor does with a theodolite. GPS measures distances and intersects spheres, which is trilateration. The distinction matters because it explains why the system needs such extraordinary clocks and no precision optics at all.

3. The fourth satellite, and the best idea in the system

There is a problem with the paragraph above, and it is fatal. Your receiver does not have a perfect clock. It has a quartz crystal worth a few cents, drifting by microseconds — and one microsecond of clock error becomes

\[10^{-6} \text{ s} \times c \;=\; 300 \text{ m}\]

of position error. An atomic clock would fix it and costs more than the phone, the car and possibly the house.

So the designers did something much cleverer than buying a better clock. They stopped treating time as a measurement and started treating it as an unknown.

Write the receiver’s clock offset as $b$ — however many seconds it is ahead of true GPS time. What the receiver can actually measure is not the true range but a pseudorange, contaminated by that same unknown offset on every satellite alike :

For satellite $i$ at known position $(x_i, y_i, z_i)$, the measured pseudorange is $$ \rho_i = \sqrt{(x - x_i)^2 + (y - y_i)^2 + (z - z_i)^2} \;+\; c\,b . $$ The unknowns are $x$, $y$, $z$ and $b$ — four of them. So four satellites give four equations, and the system is solvable.

In plain words : because the clock error is the same for every satellite, it does not hide — it shows up as a consistent inconsistency. Three spheres that should meet at a point instead fail to meet at all, and the amount by which they fail tells you exactly how wrong your clock is.

no common point with the clock error every circle is too big by the same amount one point, and the time after solving for it shrink all three alike and they meet solve for b
Figure 3 - Why the fourth satellite exists. Your receiver's clock is out by some unknown amount, and because that error is identical for every satellite, every measured range is too long by the same distance — so the circles enclose a region instead of meeting. The size of that failure is exactly what tells you the clock error. Solve for it alongside the position and both fall out at once, which is how a few cents of quartz produces atomic-clock time.

This is worth pausing on, because the consequence is enormous and mostly invisible. Solving those four equations does not merely give you a position — it hands you the exact time, for free, at atomic-clock quality, from a device that contains nothing better than a quartz crystal. That is why GPS is not really a navigation system. It is the world’s time distribution network, and power grids, mobile networks, data centres and stock exchanges all synchronise to it. Navigation is arguably the side effect.

PART II — MAKING THE MEASUREMENT
a signal buried under the noise, and four equations to solve

4. Finding a signal that is weaker than the noise

How does the receiver know when the signal left ? The satellite does not send a timestamp and stop — it continuously broadcasts a pseudo-random code, a specific sequence of 1023 bits (“chips”) repeating a thousand times a second, unique to that satellite.

The receiver generates the same sequence locally and slides its copy back and forth until the two line up. The amount of sliding needed is the travel time. Mathematically this is a correlation, which the Fourier transform post shows can be computed as a convolution — and modern receivers do exactly that, acquiring satellites with an FFT rather than by brute-force searching.

Two things make this design remarkable.

All the satellites share one frequency. Every GPS satellite transmits on 1575.42 MHz simultaneously. That works because the pseudo-random codes are chosen to be nearly orthogonal : correlate satellite 7’s incoming signal against satellite 12’s local code and you get essentially zero. It is the same orthogonality argument that lets the Fourier transform extract one frequency without contamination from the others, applied to codes instead of sinusoids.

The signal is below the noise floor. By the time it has crossed 20,000 km, the satellite’s transmission arrives at about $-128$ dBm, while the thermal noise in the receiver’s bandwidth is around $-111$ dBm. The signal is roughly seventeen decibels weaker than the noise it is buried in — put a GPS antenna on a spectrum analyser and you will see noise and nothing else. Correlating over all 1023 chips provides

\[10\log_{10}(1023) \approx 30 \text{ dB}\]

of processing gain, which is what lifts a signal you cannot see into one you can measure to a few nanoseconds.

what the antenna hears the satellite is in there, 17 dB below the noise correlate +30 dB after sliding the local code the shift that aligns them and that shift is the travel time
Figure 4 - The signal arrives buried well under the thermal noise — on the left there is genuinely nothing to see. Correlating the incoming stream against a locally generated copy of the satellite's pseudo-random code adds about 30 dB of processing gain and produces the unmistakable peak on the right. Its position is the delay that aligned the two copies, and therefore the travel time.

Riding on top of the code, at a leisurely 50 bits per second, is the navigation message : the satellite’s own orbital parameters, its clock corrections, and the health of the constellation. The receiver needs this too — knowing how far away a satellite is only helps if you know where the satellite is. At 50 bits per second the full set takes about 12.5 minutes to download, which is why a receiver with no prior information can take so long to get its first fix, and why your phone quietly fetches the same data over the mobile network instead.

5. Solving for position

Four pseudorange equations, four unknowns — but the equations are non-linear, because of the square root. The standard approach is to guess, linearise, and iterate.

Start from a guess $\mathbf{p}_0$ (the centre of the Earth will do). For each satellite compute the predicted range, and take the difference from what was measured. To first order, a small move $\Delta\mathbf{p}$ changes the predicted range by its component along the unit vector $\hat{\mathbf{e}}_i$ pointing from the receiver to that satellite. That gives a linear system :

\[\begin{equation} \underbrace{\begin{pmatrix} -\hat{\mathbf{e}}_1^{\top} & 1 \\ -\hat{\mathbf{e}}_2^{\top} & 1 \\ \vdots & \vdots \\ -\hat{\mathbf{e}}_n^{\top} & 1 \end{pmatrix}}_{G,\;\text{the geometry matrix}} \begin{pmatrix} \Delta\mathbf{p} \\ c\,\Delta b \end{pmatrix} = \Delta\boldsymbol{\rho}. \label{eq:linear} \end{equation}\]

Solve, move, repeat. It converges in three or four iterations from almost any starting point.

With more than four satellites in view — and there usually are eight to twelve — the system is overdetermined, and you solve it by least squares, exactly the machinery of the statistical inference post. The extra measurements do not just average away noise ; they also let the receiver notice when one satellite disagrees with all the others and throw it out.

import math

C = 299792458.0

def solve(sats, ranges, iters=8):
    """sats : [(x, y, z)] in metres. ranges : pseudoranges.
    Returns (x, y, z, clock_bias_seconds)."""
    x, y, z, b = 0.0, 0.0, 0.0, 0.0
    for _ in range(iters):
        G, r = [], []
        for (sx, sy, sz), rho in zip(sats, ranges):
            dx, dy, dz = x - sx, y - sy, z - sz
            d = math.sqrt(dx * dx + dy * dy + dz * dz)
            G.append([dx / d, dy / d, dz / d, 1.0])
            r.append(rho - (d + C * b))
        dp = lstsq(G, r)              # normal equations
        x, y, z = x + dp[0], y + dp[1], z + dp[2]
        b += dp[3] / C
        if max(abs(v) for v in dp[:3]) < 1e-4:
            break
    return x, y, z, b
PART III — WHY IT IS HARD
relativity, the atmosphere, and geometry

6. Relativity, and why the clocks were built wrong on purpose

Here is the part that makes GPS the most widely used practical application of relativity in existence. Two effects act on the satellite clocks, in opposite directions, and both are far too large to ignore.

Special relativity slows them down. A GPS satellite orbits at radius $r = 26{,}560$ km, so its speed is $v = \sqrt{GM/r} = 3874$ m/s. Moving clocks run slow (Einstein, 1905), by a fractional amount

\[\frac{\Delta t}{t} \;\approx\; -\frac{v^{2}}{2c^{2}} = -\frac{3874^{2}}{2 \times (2.998\times10^{8})^{2}} = -8.3 \times 10^{-11},\]

which over a day of 86,400 seconds comes to $\mathbf{-7.2}$ microseconds.

General relativity speeds them up. Clocks deeper in a gravitational well run slow (Einstein, 1916) — an effect Pound and Rebka measured in a lift shaft at Harvard (Pound & Rebka, 1960). The satellite is far out of the well compared with you, so its clock gains :

\[\frac{\Delta t}{t} \;\approx\; \frac{GM}{c^{2}}\left(\frac{1}{R_{\oplus}} - \frac{1}{r}\right) = 5.3 \times 10^{-10} \;\Longrightarrow\; \mathbf{+45.7}\ \boldsymbol{\mu}\textbf{s per day}.\]

The general-relativistic effect wins, six to one. The net drift is

\[\begin{equation} +45.7 - 7.2 \;=\; +38.5\ \mu\text{s per day}, \label{eq:net} \end{equation}\]

and multiplying by the speed of light turns that into

\[38.5\times10^{-6}\text{ s} \times c \;\approx\; \mathbf{11.5\ km\ of\ position\ error\ per\ day.}\]
-10 +0 +10 +20 +30 +40 +50 special relativity it moves at 3874 m/s, so it ticks slow -7.2 general relativity it sits high out of the well, so it ticks fast +45.7 net drift gravity wins, six to one +38.5 microseconds gained per day × the speed of light = 11.5 km of position error per day so the clocks are built to run slow by 4.6 mHz, and come right in orbit
Figure 5 - Both of Einstein's theories, pulling opposite ways on the same clock. Motion slows the satellite's clock by 7.2 µs a day ; sitting high out of Earth's gravitational well speeds it up by 45.7. General relativity wins comfortably, and the leftover 38.5 µs would become eleven and a half kilometres of position error every day if nobody corrected for it.

In plain words : ignore Einstein and your satnav is wrong by the width of a city after one day, and by the width of a country after a month. This is not a small correction applied for extra decimal places — the system simply does not function without it.

The fix is disarmingly direct. Since the drift rate is known in advance, the caesium and rubidium oscillators are deliberately manufactured to the wrong frequency. Their nominal rate is 10.23 MHz ; before launch they are set to run at

\[10.229\,999\,995\,43 \text{ MHz}\]

— slow by about 4.6 millihertz — so that once they are in orbit, moving fast and sitting high in the potential, they tick at exactly 10.23 MHz as seen from the ground.

That is not quite the end of it. GPS orbits are slightly eccentric, so both the speed and the gravitational potential vary a little around each orbit, and the relativistic rate varies with them. The receiver applies a small periodic correction — up to about 45 nanoseconds, or 14 metres — computed from the satellite's orbital eccentricity. Ashby's review is the standard reference for the full treatment (Ashby, 2003), and Hafele and Keating had already flown caesium clocks around the world in 1972 to confirm the two effects experimentally (Hafele & Keating, 1972).

7. The atmosphere gets in the way

Equation $\eqref{eq:range}$ assumed the signal travels at $c$ the whole way. It does not — the last few hundred kilometres are through atmosphere, and that costs time.

The ionosphere is a layer of free electrons that slows the modulated signal by anywhere from 5 metres’ worth of delay at zenith to 50 metres at low elevation. It would be the largest error in the system except for one very convenient property : the delay is dispersive, proportional to $1/f^{2}$.

That frequency dependence turns an unknown into a solvable one. Transmit on two frequencies — GPS uses L1 at 1575.42 MHz and L2 at 1227.60 MHz — and the difference in their delays reveals exactly how much ionosphere there was. Combining them as

\[\begin{equation} \rho_{\text{free}} = \frac{f_1^{2}\,\rho_1 - f_2^{2}\,\rho_2}{f_1^{2} - f_2^{2}} \label{eq:ionofree} \end{equation}\]

cancels the ionospheric term completely. This is why survey-grade receivers are dual-frequency and cheap ones are not.

The troposphere — the ordinary neutral air below about 50 km — adds a further 2.5 metres at zenith, rising to 25 metres near the horizon. Here the trick fails : neutral gas is not dispersive at these frequencies, so both signals are delayed identically and the difference reveals nothing. The troposphere has to be modelled instead, from elevation angle, pressure and humidity, and the residual error is one of the stubborn limits on single-point accuracy.

8. Geometry : why accuracy changes minute to minute

Two receivers with identical hardware, measuring pseudoranges to identical precision, can have very different position errors. The difference is where the satellites happen to be.

If the visible satellites are spread widely across the sky, the spheres cut through each other at steep angles and their intersection is tightly pinned. If they are clustered together, the spheres graze one another and the intersection smears out into a long thin region — a small ranging error becomes a large position error.

the error region, same scale satellites well spread DOP = 2.0 a 3 m ranging error becomes 6 m satellites bunched together DOP = 21.4 a 3 m ranging error becomes 64 m
Figure 6 - The same receiver, the same ranging precision, two very different results. When the satellites are spread across the sky the ranges cut each other at steep angles and the error region is compact. When they are bunched into one part of the sky the intersections are shallow and the uncertainty stretches out along the line of sight. The shaded ellipse is $(G^{\top}G)^{-1}$ — nothing more than the covariance of the least-squares fit.

This is quantified by the dilution of precision, and it is not a heuristic — it drops straight out of the least-squares solution :

With $G$ the geometry matrix of $\eqref{eq:linear}$, the position error is $$ \sigma_{\text{position}} = \text{DOP} \times \sigma_{\text{ranging}}, \qquad \text{DOP} = \sqrt{\operatorname{trace}\big[(G^{\top}G)^{-1}\big]}. $$

Anyone who read the statistical inference post will recognise $(G^{\top}G)^{-1}$ immediately : it is the covariance matrix of a least-squares estimate. DOP is not a GPS-specific invention at all — it is the standard error of an estimator, wearing a hat. A good geometry gives DOP around 2 ; a bad one, in a narrow street where only a few satellites are visible in a strip of sky, can give 20 or more, turning a 3-metre ranging error into a 60-metre position error with no hardware fault whatsoever.

9. Everything else that goes wrong, and how to cheat

A rough error budget for a plain single-frequency receiver, in metres of ranging error (Misra & Enge, 2011) 1 :

source typical error
ionospheric delay 5 m (modelled), up to 50 m
tropospheric delay 0.5 m after modelling
satellite clock and orbit 1–2 m
multipath 0.5–3 m, far worse in cities
receiver noise 0.3 m

Multipath is the one that ruins urban navigation. The signal arrives both directly and reflected off buildings, and the reflected copy is delayed, so the correlation peak of figure 4 smears and shifts. In a street of glass towers the direct path may be blocked entirely, leaving only reflections — which is why your phone can confidently place you on the wrong side of the road.

The remaining errors share a useful property : they are almost the same for two receivers standing near each other. The same ionosphere, the same satellite clock error, the same orbit error. So put one receiver on a surveyed point whose position you already know exactly, have it compute the discrepancy, and broadcast that as a correction. This is differential GPS, and it removes everything common to both.

Push it further and you stop measuring the code altogether and measure the phase of the carrier wave instead. The carrier has a wavelength of 19 cm, so its phase can be tracked to a few millimetres — but you only know the phase within a cycle, not how many whole cycles there are. Resolving those unknown integers (Teunissen, 1995) is what RTK does, and it is how a tractor drives itself down a row to the centimetre.

10. The system, and its relatives

The whole thing is conventionally described in three segments (Parkinson & Spilker, 1996).

  • Space. Around 31 operational satellites in six orbital planes, at 20,200 km. The orbital period is $2\pi\sqrt{r^3/GM} \approx 11$ h 58 min — half a sidereal day, so the constellation repeats its geometry daily. The altitude is a compromise : higher means each satellite covers more ground and needs fewer companions, but the signal arrives weaker and the geometry degrades.
  • Control. A master station and a network of monitors that track the satellites, measure how their clocks and orbits are drifting, and upload fresh corrections. Those corrections are what the navigation message carries.
  • User. Everything that listens. Note that it only listens — GPS is entirely one-way, which is why it supports unlimited users and why your receiver transmits nothing.

GPS is no longer alone. Russia’s GLONASS, Europe’s Galileo and China’s BeiDou all do the same job with their own constellations, and a modern chipset uses all of them at once. The reason is section 9 : more satellites means better geometry, and better geometry means lower DOP — which improves accuracy without a single change to the hardware’s ranging precision.

11. What it cannot do

Two limits are worth stating plainly, because both are structural rather than temporary.

It needs a line of sight to the sky. Indoors, underground, underwater or under dense canopy, there is no signal — hence the dead reckoning from accelerometers, the Wi-Fi and cell-tower databases, and the barometer that your phone quietly blends in.

The signal is desperately weak, and that is a security problem. A transmission that arrives below the noise floor from 20,000 km away is trivially overpowered. A one-watt jammer in a lorry cab denies GPS across a wide area, and spoofing — broadcasting plausible but false signals — is harder to detect than jamming, because the receiver has no way to authenticate a civilian signal. Since so much infrastructure takes its timing from GPS rather than its position, this is a genuine single point of failure, and it is why terrestrial timing backups are being rebuilt in several countries.

12. Conclusion

GPS is a chain of good ideas, and the best one is not the satellites.

Distance is a stopwatch reading, so the whole problem becomes timekeeping — and at the speed of light, a metre of accuracy costs three nanoseconds. Three satellites would pin you down if you had an atomic clock, and you do not ; so instead of buying one, the system treats your clock error as a fourth unknown and solves for it. That single decision is what lets a few cents of quartz produce a position, and it is also what turned a navigation system into the world’s clock.

Then the physics has to be respected rather than approximated. The satellites’ clocks run fast by 38 microseconds a day — gravity speeding them up more than motion slows them down — and the fix was to build them to the wrong frequency on the ground so they would be right in orbit. Ignore that and the system drifts eleven kilometres off in a day. The ionosphere is beaten by measuring on two frequencies and exploiting its dispersion ; the troposphere is not dispersive and simply has to be modelled ; and the residual accuracy is set not by the hardware but by where the satellites happen to be, through a dilution factor that is nothing more exotic than the covariance of a least-squares fit.

It is a rare piece of engineering in which relativity, signal processing below the noise floor, and ordinary regression all have to be right at once — and in which you can watch each of them fail in a specific, measurable number of metres if it is not.

References

  1. Ashby, N. (2003). Relativity in the Global Positioning System. Living Reviews in Relativity, 6(1), 1–42.
    @article{Ashby2003,
      author = {Ashby, Neil},
      title = {Relativity in the Global Positioning System},
      journal = {Living Reviews in Relativity},
      volume = {6},
      number = {1},
      pages = {1--42},
      year = {2003}
    }
    
  2. Einstein, A. (1905). Zur Elektrodynamik bewegter Körper. Annalen Der Physik, 322(10), 891–921.
    @article{Einstein1905,
      author = {Einstein, Albert},
      title = {Zur Elektrodynamik bewegter K{\"o}rper},
      journal = {Annalen der Physik},
      volume = {322},
      number = {10},
      pages = {891--921},
      year = {1905}
    }
    
  3. Einstein, A. (1916). Die Grundlage der allgemeinen Relativitätstheorie. Annalen Der Physik, 354(7), 769–822.
    @article{Einstein1916,
      author = {Einstein, Albert},
      title = {Die Grundlage der allgemeinen Relativit{\"a}tstheorie},
      journal = {Annalen der Physik},
      volume = {354},
      number = {7},
      pages = {769--822},
      year = {1916}
    }
    
  4. Hafele, J. C., & Keating, R. E. (1972). Around-the-World Atomic Clocks: Predicted Relativistic Time Gains. Science, 177(4044), 166–168.
    @article{HafeleKeating1972,
      author = {Hafele, Joseph C. and Keating, Richard E.},
      title = {Around-the-World Atomic Clocks: Predicted Relativistic Time Gains},
      journal = {Science},
      volume = {177},
      number = {4044},
      pages = {166--168},
      year = {1972}
    }
    
  5. Misra, P., & Enge, P. (2011). Global Positioning System: Signals, Measurements, and Performance (2nd ed.). Ganga-Jamuna Press.
    @book{MisraEnge2011,
      author = {Misra, Pratap and Enge, Per},
      title = {Global Positioning System: Signals, Measurements, and Performance},
      edition = {2nd},
      year = {2011},
      publisher = {Ganga-Jamuna Press}
    }
    
  6. Parkinson, B. W., & Spilker, J. J. (1996). Global Positioning System: Theory and Applications. American Institute of Aeronautics and Astronautics.
    @book{Parkinson1996,
      author = {Parkinson, Bradford W. and Spilker, James J.},
      title = {Global Positioning System: Theory and Applications},
      year = {1996},
      publisher = {American Institute of Aeronautics and Astronautics}
    }
    
  7. Pound, R. V., & Rebka, G. A. (1960). Apparent Weight of Photons. Physical Review Letters, 4(7), 337–341.
    @article{PoundRebka1960,
      author = {Pound, Robert V. and Rebka, Glen A.},
      title = {Apparent Weight of Photons},
      journal = {Physical Review Letters},
      volume = {4},
      number = {7},
      pages = {337--341},
      year = {1960}
    }
    
  8. Teunissen, P. J. G. (1995). The Least-Squares Ambiguity Decorrelation Adjustment: A Method for Fast GPS Integer Ambiguity Estimation. Journal of Geodesy, 70(1–2), 65–82.
    @article{Teunissen1995,
      author = {Teunissen, Peter J. G.},
      title = {The Least-Squares Ambiguity Decorrelation Adjustment: A Method for Fast {GPS} Integer Ambiguity Estimation},
      journal = {Journal of Geodesy},
      volume = {70},
      number = {1--2},
      pages = {65--82},
      year = {1995}
    }
    
  1. Until May 2000 the civilian signal was deliberately degraded by a scheme called Selective Availability, which dithered the satellite clocks and broadcast slightly wrong orbits, holding civilian accuracy to about 100 metres while the military kept the full precision. It was switched off by presidential order, and accuracy improved roughly tenfold overnight. Differential GPS had by then made it largely pointless anyway — the corrections that cancel ionospheric error cancel deliberate dithering just as well. ↩

who am i

Hi! I am a Data Scientist by profession, an Emacs devotee and an untalented bassist. I intend to use this space for writing about things that I think I have understood well in the hope that they may be helpful to others, including my future self.

what is this

OhMyKode is an opportunity to share knowledge about mathematics, computer science, machine learning and algorithmic beauty, which allows us to improve our skills and learn in depth. It is a sharing place to learn the how and the why.

© MMXVIII - MMXXVI by Maâmra Youcef - معامره يوسف
Content available under Creative Commons (BY-NC-SA) unless otherwise noted.
This site is hosted at Github Pages and powered by Jekyll & Papyrus.
“We can't skip Math forever !”