Tivadar Danka Profile picture
Mar 4, 2022 14 tweets 5 min read Read on X
There is a mind-blowing application of matrix multiplication: doing recursion (almost) at the speed of light!

By the end of this thread, you'll learn precisely how.

Trust me, if you are into programming and math, you want to know this trick.

↓ ↓ ↓
Let's start with the simplest example for recursion: Fibonacci numbers.

Each Fibonacci number is the sum of the previous one and the one before.

The recursion starts with 0 and 1.
In Python, the implementation is rather straightforward.

Can you guess the issue?
The execution is extremely slow, as each function call involves two more calls!

Thus, the `fibonacci(n)` calls itself many times!
Now, let's talk about matrix multiplication.

What do you get when multiplying a row and a column vector? Their inner product.

How does this relate to the Fibonacci numbers?
Simple: we can express the Fibonacci recursion in terms of vectors.
With one small trick, we can turn this into an iterative process.

By adding a second column to the right side, we can copy the n-th Fibonacci number over.

Thus, we have a recursive relation.
We can express the above without recursion!

Applying our matrix recursion n times, we obtain an explicit formula to calculate the Fibonacci numbers.

This is much faster to compute.
Just one more step.

By noticing that the Fibonacci numbers start with 0, 1, 1, we can stack two shifted vectors on top of itself and obtain the n+1-th, n-th, n-1-th Fibonacci numbers purely by raising the right matrix to the n-th power.
By clearing everything up, we obtain an extremely elegant formula.

Tell me it's not beautiful. I dare you.
We can quickly implement the formula in NumPy.

Let's see how it performs!
As you can see, it is much faster than the vanilla version.

Moreover, while the vanilla implementation has exponential time complexity, this has linear. Quite the difference!
A small caveat, though. Due to integer overflow, NumPy is not suitable for this task.

Homework for you: write a plain Python implementation that takes advantage of the arbitrarily large ints!

Feel free to share your solution! (I made the snippets with carbon.sh.)
Having a deep understanding of math will make you a better engineer. I want to help you with this, so I am writing a comprehensive book about the subject.

If you are interested in the details and beauties of mathematics, check out the early access!

tivadardanka.com/book

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Tivadar Danka

Tivadar Danka Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @TivadarDanka

Dec 11
The single most undervalued fact of linear algebra: matrices are graphs, and graphs are matrices.

Encoding matrices as graphs is a cheat code, making complex behavior simple to study.

Let me show you how! Image
If you looked at the example above, you probably figured out the rule.

Each row is a node, and each element represents a directed and weighted edge. Edges of zero elements are omitted.

The element in the 𝑖-th row and 𝑗-th column corresponds to an edge going from 𝑖 to 𝑗.
To unwrap the definition a bit, let's check the first row, which corresponds to the edges outgoing from the first node. Image
Read 18 tweets
Dec 9
Matrix multiplication is not easy to understand.

Even looking at the definition used to make me sweat, let alone trying to comprehend the pattern. Yet, there is a stunningly simple explanation behind it.

Let's pull back the curtain! Image
First, the raw definition.

This is how the product of A and B is given. Not the easiest (or most pleasant) to look at.

We are going to unwrap this. Image
Here is a quick visualization before the technical details.

The element in the i-th row and j-th column of AB is the dot product of A's i-th row and B's j-th column. Image
Read 17 tweets
Nov 23
The single biggest argument about statistics: is probability frequentist or Bayesian?

It's neither, and I'll explain why.

Buckle up. Deep-dive explanation incoming. Image
First, let's look at what is probability.

Probability quantitatively measures the likelihood of events, like rolling six with a dice. It's a number between zero and one. This is independent of interpretation; it’s a rule set in stone. Image
In the language of probability theory, the events are formalized by sets within an event space.

The event space is also a set, usually denoted by Ω.) Image
Read 33 tweets
Nov 19
The single most undervalued fact of linear algebra: matrices are graphs, and graphs are matrices.

Encoding matrices as graphs is a cheat code, making complex behavior simple to study.

Let me show you how! Image
If you looked at the example above, you probably figured out the rule.

Each row is a node, and each element represents a directed and weighted edge. Edges of zero elements are omitted.

The element in the 𝑖-th row and 𝑗-th column corresponds to an edge going from 𝑖 to 𝑗.
To unwrap the definition a bit, let's check the first row, which corresponds to the edges outgoing from the first node. Image
Read 18 tweets
Oct 25
The following multiplication method makes everybody wish they had been taught math like this in school.

It's not just a cute visual tool: it illuminates how and why long multiplication works.

Here is the full story: Image
First, the method.

The first operand (21 in our case) is represented by two groups of lines: two lines in the first (1st digit), and one in the second (2nd digit).

One group for each digit.
Similarly, the second operand (32) is encoded with two groups of lines, one for each digit.

These lines are perpendicular to the previous ones.
Read 10 tweets
Oct 21
The way you think about the exponential function is wrong.

Don't think so? I'll convince you. Did you realize that multiplying e by itself π times doesn't make sense?

Here is what's really behind the most important function of all time: Image
First things first: terminologies.

The expression aᵇ is read "a raised to the power of b."

(Or a to the b in short.) Image
The number a is called the base, and b is called the exponent.

Let's start with the basics: positive integer exponents. By definition, aⁿ is the repeated multiplication of a by itself n times.

Sounds simple enough. Image
Read 18 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(