From 5ed08ed8ef8a0b52740010c45d054bfd5bb6dfba Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 29 Jul 2026 18:12:54 -0400 Subject: [PATCH] project euclid problem 1 general solution --- static/posts/pe-p1/image.png | Bin 0 -> 5703 bytes static/posts/pe-p1/post.typ | 66 +++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 static/posts/pe-p1/image.png create mode 100644 static/posts/pe-p1/post.typ diff --git a/static/posts/pe-p1/image.png b/static/posts/pe-p1/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9c365ee050009bf76be3d6506746bd3dd28350 GIT binary patch literal 5703 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 G(f%++WB literal 0 HcmV?d00001 diff --git a/static/posts/pe-p1/post.typ b/static/posts/pe-p1/post.typ new file mode 100644 index 0000000..452c1b1 --- /dev/null +++ b/static/posts/pe-p1/post.typ @@ -0,0 +1,66 @@ +#let post_slug = "pe-p1" +#let post_preview_image = "image.png" +#let post_summary = "General solution to Project Euler Problem 1" +#let post_date = "2026-07-29" + += Project Euler Problem 1 + +== Statement +If we list all the natural numbers below $10$ that are multiples of $3$ or $5$, we get $3, 5, 6,$ and $9$. The sum of these multiples is $23$. Find the sum of all the multiples of $3$ or $5$ below $1000$. + +== Solution + +Suppose the base numbers were $2$ and $3$ below $10$ so $9$, they would create duplicates, ie $6$ is counted twice. Therefore take the sum of each multiple to the limit, and one time remove the numbers counted twice: + +$ +&2+4+6+8+3+cancel(6)+9 = 32\ +&sum_(i=1)^(floor(9/(2)))2i + sum_(i=1)^(floor(9/(3))) 3i - sum_(i=1)^(floor(9/(6))) 6i \ += 2&sum_(i=1)^(floor(9/(2)))2i + 3sum_(i=1)^(floor(9/(3))) i - 6sum_(i=1)^(floor(9/(6))) i \ += 2&sum_(i=1)^4 i + 3sum_(i=1)^3 i - 6sum_(i=1)^(1) i\ += 2& (4(5))/2 + 3 (3(4))/2 - 6 (1(2))/2\ += 3&2 +$ + +This revealed a general solution, for base numbers $n, m$ below $L$: + +$ +f(n,m,L) =&n sum_(i=1)^floor((L-1)/n) i + m sum_(i=1)^floor((L-1)/m) i- n m sum_(i=1)^floor((L-1)/(n m))i \ +"Define "&a = floor((L-1)/n), b = floor((L-1)/m), c = floor((L-1)/(n m)) \ +=> f(n,m,L) =& (n a(a+1) + m b(b+1) - n m (c)(c+1))/2 +$ + + +Testing this as code: +```py +>>> def f(n,m,L): +... a = floor((L-1)/n) +... b = floor((L-1)/m) +... c = floor((L-1)/(n*m)) +... return ((n*a*(a+1)) + (m*b*(b+1)) - (n*m*c*(c+1)))/2 +... +>>> f(2,3,10) +44.0 +>>> f(3,5,10) +23.0 +``` + +This general solution passes the two tests above. + +```py +>>> f(3,5,1000) +233168.0 +``` + +Testing against the question, this result is successful. But what about for more than 2 numbers? How can this be approached? + +Given a set $A$ of base numbers, a multiple would be counted once for each of its divisors present in $A$. + +An easy solution is that in code, a hashmap could track the number of times each number is counted, and iteratively remove duplicates. + +The goal is to not add the number if it was already added. + +Mathamatically this can be done piecewise. If a previous element of $A$ divides $A_i k$, skip that number. + +$ +f(A, L) = sum_(i)^abs(A)[sum_(k=1)^floor((L-1)/A_i) cases(0 quad & A_j divides A_i k and j < k, A_i k quad & A_j divides.not A_i k and j < k)] +$ \ No newline at end of file