Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion _posts/2025-12-08-2s-complement.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories: cs, binary, bits, negative numbers, derivation, proof, math, 2's com
permalink: /2s-complement
---

## Preamble
## Introduction

If you have ever taken CS in high school or college, you have probably been taught about how to represent negative numbers in binary using 2's complement.

Expand Down
78 changes: 37 additions & 41 deletions _posts/2025-12-10-2nd-diff.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,31 @@
---
layout: post
title: 2nd Difference Formula Proof
title: 2nd Difference Derivation & Proof
date: 2025-12-10
categories: math, 2nd difference, second difference, proof, derivation, recursion, closed-form solution
categories: math, constant 2nd difference, constant second difference, proof, derivation, recurrence, recursion, closed-form solution, nth term
permalink: /2nd-diff
---

## 1. Preamble<a name="preamble"></a>
## 1. Introduction<a name="intro"></a>

During junior high school, I was introduced to a formula for finding the n<sup>th</sup> term of a certain sequence with a second difference that went something like:
During a math class in junior high school, I was introduced to a formula for finding the n<sup>th</sup> term of a certain sequence with a constant second difference that went something like:

T<sub>n</sub> = 1/2(n)<sup>2</sup> - 1/2(n) + 1, for a sequence `1, 2, 4, 7 ...` and n >= 1.

At first, the formula seemed quite random (similar to the quadratic formula) and I could not wrap my head around it at the time.
The teacher never really explained it though, so it was just a mysterious formula to me at the time.

I wondered how adding a second difference could make the trivial arithmetic formula so complex, and I was inspired by a textbook I was reading ("Concrete Mathematics" by Donald Knuth), so I tried to derive the formula myself.
I also did not like to use things I did not understand, and there is no better way to understand something than to make it yourself from scratch.

I wrote this blog post to share in hopes that someone may find it useful.
Later in college, I was inspired by a textbook I was reading (Chapter 1 of Concrete Mathematics by Donald Knuth on Recurrence Relations) and remembered the mysterious formula, so I tried to derive it myself to better understand it.

## 2. What is a 2<sup>nd</sup> Difference?

Say there is a sequence `1, 2, 4, 7 ...`.
You may have come across quite a few of these types of sequences on IQ tests and whatnot, and it is easy to find that the fifth term is 11 and so on.

However, it is obvious at a glance that the sequence does not follow the familiar arithmetic or geometric formulas, so we cannot yet find an arbitrary n<sup>th</sup> term of the sequence without knowing the previous terms.
Finding the general formula for this will be the goal of this derivation.
However, it is obvious at a glance that the sequence does not follow the familiar formulas for finding the n<sup>th</sup> term of arithmetic or geometric sequences, so we cannot yet find an arbitrary n<sup>th</sup> term of the sequence without first knowing the previous terms.
Finding the general closed-form solution for this will be the goal of this derivation.

The difference or ratio between every term and its subsequent term is not constant, unlike what is needed for a+(n-1)d or ar<sup>n-1</sup> to work properly.
Instead, the difference (which we will now call the 'first difference') increases by a constant amount as the sequence goes on.
Instead, the difference (which we will call the 'first difference') increases by a constant amount as the sequence goes on.

We can see this clearly if we construct a new sequence from the first differences:

Expand All @@ -44,15 +41,15 @@ so the sequence of first differences is:

`1, 2, 3 ...`.

Unlike the original sequence, it is easy to see that this sequence has a constant difference of one, so the n<sup>th</sup> term can be found using the familiar formula (albeit with some notation modifications):
Unlike the original sequence, it is easy to see that this sequence has a constant difference of one, so the n<sup>th</sup> term can be found using the familiar formula (albeit with some modifications to notation):

(d<sub>1</sub>)<sub>n</sub> = a<sub>2</sub> + (n - 1)d<sub>2</sub>, for n >= 1,

where (d<sub>1</sub>)<sub>n</sub> is the n<sup>th</sup> first difference, a<sub>2</sub> is the first term of the sequence of first differences (a<sub>1</sub> would be the first term of the original sequence), and d<sub>2</sub> is the difference for the sequence of first differences (or the second difference).
where (d<sub>1</sub>)<sub>n</sub> is the n<sup>th</sup> first difference, a<sub>2</sub> is the first term of the sequence of first differences (a<sub>1</sub> would be the first term of the original sequence), and d<sub>2</sub> is the constant difference between each term in the sequence of first differences (which we will call the 'second difference').

## 3. Derivation of the Formula

Using the approach we naturally used to find that 11 was the fifth term in the original sequence earlier, we can model the sequence as a recursive problem:
Taking inspiration from how we intuitively found that 11 was the fifth term in the original sequence earlier, we model the sequence as a recurrence problem:

T<sub>1</sub> = a<sub>1</sub>;

Expand All @@ -64,13 +61,13 @@ Note that it is (d<sub>1</sub>)<sub>n-1</sub> and not (d<sub>1</sub>)<sub>n</sub

so it is

(d<sub>1</sub>)<sub>n</sub> = T<sub>n+1</sub> - T<sub>n</sub>
(d<sub>1</sub>)<sub>n</sub> = T<sub>n+1</sub> - T<sub>n</sub>,

and not

(d<sub>1</sub>)<sub>n</sub> = T<sub>n</sub> - T<sub>n-1</sub>.

Moving on, we expand---or "unfold"---the recursive formula to try and spot some patterns we could use to find a closed-form solution:
Moving on: we expand---or "unfold"---the recursive formula to try and spot some patterns we could use to find a closed-form solution:

T<sub>n</sub> = T<sub>n-1</sub> + (d<sub>1</sub>)<sub>n-1</sub>

Expand Down Expand Up @@ -141,16 +138,32 @@ T<sub>n</sub> = a<sub>1</sub> + (n - 1)a<sub>2</sub> + 1/2(n - 2)(n - 1)d<sub>2<

= 1/2(n)<sup>2</sup> - 1/2(n) + 1.

Which matches what I wrote on the [preamble](/2nd-diff#preamble).
You can try out a few examples to check for any counter-examples, but you will not know for certain if it will always be correct unless you prove it, which will be talked about in the next section.
Which matches what I wrote in the [introduction](/2nd-diff#intro).
You can try out a few examples to check for any counter-examples, but you will not know for certain if it will always be correct unless you prove it, which is what we will do in the next section.

## 4. Proof by Mathematical Induction

Continuing from the previous section: the derivation makes sense, and we can try a few examples, but how do we know for sure that there is no counter-example somewhere we did not check?
We need to be mathematically rigorous to show our formula will always work.

Fortunately, there is a convenient method called "proof by induction" that fits nicely for our sequences situation.
If we show that our formula is true for a base case and also that it is true for any n if it was true for (n - 1), we can confidently conclude that the formula is true for all n.
Fortunately, there is a convenient method called "proof by induction" that fits nicely into our sequences situation.
If we show that our formula is true for a base case and also that it is true for any n if it was true for (n - 1), we can confidently conclude that the formula is true for all positive integer n.

### 4.2 Base Case<a name="base"></a>

Plugging in the formula for T<sub>1</sub>:

T<sub>1</sub> = a<sub>1</sub> + (n - 1)a<sub>2</sub> + 1/2(n - 2)(n - 1)d<sub>2</sub>

= a<sub>1</sub> + (1 - 1)a<sub>2</sub> + 1/2(1 - 2)(1 - 1)d<sub>2</sub>, for n = 1

= a<sub>1</sub> + (0)a<sub>2</sub> + 1/2(-1)(0)d<sub>2</sub>, for n = 1

= a<sub>1</sub> + 0 + 0

= a<sub>1</sub>.

Which matches our definition, hence proving that the formula is true for n = 1.

### 4.1 Induction Step<a name="step"></a>

Expand Down Expand Up @@ -195,28 +208,11 @@ T<sub>n</sub> = a<sub>1</sub> + ((n - 1) - 1)a<sub>2</sub> + 1/2((n - 1) - 2)((n
= a<sub>1</sub> + (n - 1)a<sub>2</sub> + 1/2(n - 2)(n - 1)d<sub>2</sub>

That matches our formula, and hence proves that the formula will hold true for any n if (n - 1) is true.
However, we are still missing our base case (n = 1), which is covered in the next subsection.

### 4.2 Base Case

Plugging in the formula for T<sub>1</sub>:

T<sub>1</sub> = a<sub>1</sub> + (n - 1)a<sub>2</sub> + 1/2(n - 2)(n - 1)d<sub>2</sub>

= a<sub>1</sub> + (1 - 1)a<sub>2</sub> + 1/2(1 - 2)(1 - 1)d<sub>2</sub>, for n = 1

= a<sub>1</sub> + (0)a<sub>2</sub> + 1/2(-1)(0)d<sub>2</sub>, for n = 1

= a<sub>1</sub> + 0 + 0

= a<sub>1</sub>.

Which matches our definition, and hence proves that the formula is true for n = 1.
Combining that with the earlier [induction step](/2nd-diff#step), we get that it is also true for n = 2, n - 1 = 1.
Then that also shows that the formula is true for n = 3, n - 1 = 2.
This then continues on infinitely, which shows that our formula holds true for any n.
### 4.3 Conclusion

QED.
Combining the [base case](/2nd-diff#base) with the [induction step](/2nd-diff#step), we get that it is also true for n = 2 (as it is true for n = 1), which also shows that the formula is true for n = 3 (as it is true for n = 2) and so on.
This continues infinitely, showing our formula holds true for any positive integer n. QED.

## 5. Conclusion

Expand Down
8 changes: 4 additions & 4 deletions _site/404.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@
<meta property="og:locale" content="en_US" />
<meta name="description" content="Technical blog" />
<meta property="og:description" content="Technical blog" />
<link rel="canonical" href="https://de-soot.github.io/404.html" />
<meta property="og:url" content="https://de-soot.github.io/404.html" />
<link rel="canonical" href="http://localhost:4000/404.html" />
<meta property="og:url" content="http://localhost:4000/404.html" />
<meta property="og:site_name" content="de_soot" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="de_soot" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","description":"Technical blog","headline":"de_soot","url":"https://de-soot.github.io/404.html"}</script>
{"@context":"https://schema.org","@type":"WebPage","description":"Technical blog","headline":"de_soot","url":"http://localhost:4000/404.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://de-soot.github.io/feed.xml" title="de_soot" /></head>
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="de_soot" /></head>
<body><header class="site-header" role="banner">

<div class="wrapper"><a class="site-title" rel="author" href="/">de_soot</a><nav class="site-nav">
Expand Down
8 changes: 4 additions & 4 deletions _site/about.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@
<meta property="og:locale" content="en_US" />
<meta name="description" content="Technical blog" />
<meta property="og:description" content="Technical blog" />
<link rel="canonical" href="https://de-soot.github.io/about" />
<meta property="og:url" content="https://de-soot.github.io/about" />
<link rel="canonical" href="http://localhost:4000/about" />
<meta property="og:url" content="http://localhost:4000/about" />
<meta property="og:site_name" content="de_soot" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="About" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","description":"Technical blog","headline":"About","url":"https://de-soot.github.io/about"}</script>
{"@context":"https://schema.org","@type":"WebPage","description":"Technical blog","headline":"About","url":"http://localhost:4000/about"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://de-soot.github.io/feed.xml" title="de_soot" /></head>
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="de_soot" /></head>
<body><header class="site-header" role="banner">

<div class="wrapper"><a class="site-title" rel="author" href="/">de_soot</a><nav class="site-nav">
Expand Down
8 changes: 4 additions & 4 deletions _site/dark-mode.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,17 @@
<meta property="og:locale" content="en_US" />
<meta name="description" content="Alternative title: System default theme for webpages" />
<meta property="og:description" content="Alternative title: System default theme for webpages" />
<link rel="canonical" href="https://de-soot.github.io/dark-mode" />
<meta property="og:url" content="https://de-soot.github.io/dark-mode" />
<link rel="canonical" href="http://localhost:4000/dark-mode" />
<meta property="og:url" content="http://localhost:4000/dark-mode" />
<meta property="og:site_name" content="de_soot" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2024-09-07T00:00:00+08:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Dark Mode without Javascript" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2024-09-07T00:00:00+08:00","datePublished":"2024-09-07T00:00:00+08:00","description":"Alternative title: System default theme for webpages","headline":"Dark Mode without Javascript","mainEntityOfPage":{"@type":"WebPage","@id":"https://de-soot.github.io/dark-mode"},"url":"https://de-soot.github.io/dark-mode"}</script>
{"@context":"https://schema.org","@type":"BlogPosting","dateModified":"2024-09-07T00:00:00+08:00","datePublished":"2024-09-07T00:00:00+08:00","description":"Alternative title: System default theme for webpages","headline":"Dark Mode without Javascript","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/dark-mode"},"url":"http://localhost:4000/dark-mode"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://de-soot.github.io/feed.xml" title="de_soot" /></head>
<link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="de_soot" /></head>
<body><header class="site-header" role="banner">

<div class="wrapper"><a class="site-title" rel="author" href="/">de_soot</a><nav class="site-nav">
Expand Down
Loading
Loading