I build things where the math is the point, not the plumbing โ and then I make sure you can see it happen, not just read about it.
BSc(Hons.) Data Science & AI, IIT Guwahati ยท PG Diploma in Applied Statistics, ISI Kolkata. Most of what's below started as "is this actually true?" and turned into a repo. One of them turned into an entry in the OEIS.
In August 2026, six terms I computed were accepted into OEIS A181671 โ the count of Ramanujan primes below each power of ten. The sequence's EXTENSIONS section now reads:
a(18)-a(23) from Gaurav Vyas, Aug 15 2026
That pushes the table from 10ยนโท out to 10ยฒยณ, computed on a laptop and a desktop โ
no institute, no cluster โ with a 128-bit segmented sieve, bracketed analytic tail
bounds, and a machine-checkable certificate behind every term. The
b-file now runs n = 1..23.
The definition, animated: ฯ(x) โ ฯ(x/2) climbing, and each Ramanujan prime Rโ lighting up at the last place the curve crosses level n โ which is exactly what makes it Rโ. Rendered fresh by CI.
while (curious) {
pick_an_equation();
make_it_move();
ask("why is this surprising?");
}
Mathematical Surprises โ 250+ interactive visualizations โ fractals, chaos, number theory, calculus โ each one a real simulation you can drag sliders on, not a screenshot. Opens the same on your phone as on your laptop.
Nine rotating circles on the odd harmonics, tracing a square wave โ one of the 250+ live pieces in Mathematical Surprises.
Mathematics & number theory
| ๐ข ramanujan-primes-beyond-1e19 | The A181671 extension above โ paper, C++/Python sieve, and certificates for a(1)โa(23) |
| โก ramanujan-primes-beyond-2-56 | The base-2 sibling: a(57)โa(72) of A190502 certified by the same method, Q = 2โฟ instead of 10แต |
| ๐ mathematical-surprises | A live gallery of interactive math & physics โ the equation, the picture, and why it's weird, side by side |
Machine learning
| โ๏ธ chess-ai | A 760k-parameter residual policyโvalue net: supervised pretraining, then gated self-play RL, with a live training dashboard โ see below for what it actually measured |
| โ๏ธ ocr2tex | LoRA fine-tunes of GLM-OCR turning handwritten math into compilable LaTeX |
| ๐ค Gemini-AI-Studio | Gemini-powered assignment evaluator |
Applied
| ๐ฑ carboncampus | Campus-calibrated urban carbon calculator โ offline-first PWA, no backend needed. Avinya 2026, IIT Guwahati |
| ๐ฐ๏ธ drishti | Post-disaster "information fog" resolver: calibrated belief over conflicting settlement reports plus asset routing on a damaged road network |
| ๐ท hemispheR-py | Hemispherical canopy photo analysis โ LAI, clumping, gap fraction, without OpenCV or R |
The chess engine's self-play half did not work, and that's the interesting part. A 40-game match against its own frozen pretrained baseline scored 46.2% (95% CI 37.4โ55.1) โ no detectable improvement. The run before it was actively worse, and the reason took a while to find: the eval metric had been scoring one colour while the net alternated, so 159 logged evaluation points sat pinned at exactly 50% and carried no information at all. Mirror augmentation was also flipping board files without swapping the castling planes, quietly corrupting half of every minibatch.
The binding constraint turned out to be sample efficiency โ 128 simulations is about
4.3 visits per legal move, against AlphaZero's ~27. All of it is written up in the
repo's RESULTS.md, because a negative result you can reproduce is worth more than a
positive one you can't.
I also build complete games solo โ engine, art and audio. Both are zero-dependency and fully offline, with every sprite and sound generated at runtime.
| ๐ฑ Voltfall โ Android | Neon survival-action roguelite, ~95 KB |
| ๐ฅ๏ธ Neon Depths โ Windows | Neon twin-stick roguelite, twelve floors, one life, ~99 MB |
๐ง How this page builds itself
Neither animation above is a checked-in file. Both are drawn from scratch by CI on every
push to main and again once a day, then published to the output branch:
scripts/generate_ramanujan.pyโ sieves primes, computes ฯ(x) โ ฯ(x/2), solves for each Rโ as the last crossing of level n, and animates the sweep. It asserts its own output against the known head of A104272, so a broken render fails the build instead of shipping a wrong picture.scripts/generate_epicycles.pyโ sums nine odd harmonics into a square wave and traces the tip.
Both are pure Pillow, no matplotlib, so the whole job stays cheap. The contribution snake
comes from Platane/snk.
"The purpose of computing is insight, not numbers." โ Richard Hamming