The post Project Euler 128 Solution appeared first on Dreamshire.
]]>A hexagonal tile with number 1 is surrounded by a ring of six hexagonal tiles, starting at "12 o'clock" and numbering the tiles 2 to 7 in an anti-clockwise direction.
New rings are added in the same fashion, with the next rings being numbered 8 to 19, 20 to 37, 38 to 61, and so on. The diagram below shows the first three rings.
By finding the difference between tile n and each its six neighbours we shall define PD(n) to be the number of those differences which are prime.
For example, working clockwise around tile 8 the differences are 12, 29, 11, 6, 1, and 13. So PD(8) = 3.
In the same way, the differences around tile 17 are 1, 17, 16, 1, 11, and 10, hence PD(17) = 2.
It can be shown that the maximum value of PD(n) is 3.
If all of the tiles for which PD(n) = 3 are listed in ascending order to form a sequence, the 10th tile would be 271.
Find the 2000th tile in this sequence.
This is a modified version of the solution for probelm 58 - The square spiral - as this is a hex spiral constructed in the same way. As you may have guessed, just like ignoring the bottom-right diagonal in the square spiral, there are many directions we can ignore here as well as they always yield a non-prime difference (both even or both odd).
The solution below is a first swing at finding a solution. The real task is to learn of the generating function that will replace this brute force search.
from Euler import is_prime
def tiles(L=2000):
n, c = 1, 1
while c <= L:
r = 6 * n
if is_prime(r-1):
if is_prime(r+1) and is_prime(2*r+5): c += 1
if is_prime(r+5) and is_prime(2*r-7): c += 1
n += 1
return n-1
n = tiles()
print 3*n*(n - 1) + 2 if is_prime(6*n+1) else 3*n*(n + 1) + 1
Use this link to get the Project Euler 128 Solution Python 2.7 source.The post Project Euler 128 Solution appeared first on Dreamshire.
]]>The post Project Euler 94 Solution appeared first on Dreamshire.
]]>It is easily proved that no equilateral triangle exists with integral length sides and integral area. However, the almost equilateral triangle 5-5-6 has an area of 12 square units.
We shall define an almost equilateral triangle to be a triangle for which two sides are equal and the third differs by no more than one unit.
Find the sum of the perimeters of all almost equilateral triangles with integral side lengths and area and whose perimeters do not exceed one billion (1,000,000,000).
A good magic trick seems to defy both logic and physics until the secret is revealed. Then your response is something like: "What? That's it! You just stacked the deck? I can't believe I fell for that!" But until that point you were truly impressed.
Such are the secrets of these infernal math problems. I usually have few clues knowing where to begin and after some research and study I hack together a few short lines of code and wonder: "How is it I didn't see that two hours ago?"
Anyway, here's the solution to this problem of isoscele triangles trying to masquerade as "almost equilaterals." Resources include Wikipedia's article Almost-equilateral Heronian triangles, the series Reference: The On-Line Encyclopedia of Integer Sequences (OEIS) : Areas of 'close-to-equilateral' integer triangles, and the table below in the comments section which yields some evidence of a sequence and the recurrence equation wrapped in a Diophantine equation that guarantee integer results.
Adding ±1 to the perimeter guarantees an even area and perimeter as the problem requires.
Side 1 (a) | Side 2 (a) | Side 3 (b=a±1) | Perimeter | Area |
---|---|---|---|---|
5 | 5 | 6 | 16 | 12 |
17 | 17 | 16 | 50 | 120 |
65 | 65 | 66 | 196 | 1848 |
241 | 241 | 240 | 722 | 25080 |
901 | 901 | 902 | 2704 | 351780 |
3361 | 3361 | 3360 | 10082 | 4890480 |
12545 | 12545 | 12546 | 37636 | 68149872 |
46817 | 46817 | 46816 | 140450 | 949077360 |
174725 | 174725 | 174726 | 524176 | 13219419708 |
652081 | 652081 | 652080 | 1956242 | 184120982760 |
2433601 | 2433601 | 2433602 | 7300804 | 2564481115560 |
9082321 | 9082321 | 9082320 | 27246962 | 35718589344360 |
33895685 | 33895685 | 33895686 | 101687056 | 497495864091732 |
126500417 | 126500417 | 126500416 | 379501250 | 6929223155685600 |
The post Project Euler 94 Solution appeared first on Dreamshire.
]]>The post Project Euler 123 Solution appeared first on Dreamshire.
]]>Let p_{n} be the nth prime: 2, 3, 5, 7, 11, ..., and let r be the remainder when (p_{n}−1)^{n} + (p_{n}+1)^{n} is divided by p_{n}^{2}.
For example, when n = 3, p_{3} = 5, and 4^{3} + 6^{3} = 280 ≡ 5 mod 25.
The least value of n for which the remainder first exceeds 10^{9} is 7037.
Find the least value of n for which the remainder first exceeds 10^{10}.
Using much of our understanding from solving Problem 120, we are able to easily adapt those methods to solve this problem. The differences are as follows:
We can make an educated guess of how many primes we'll need by applying the remainder formula to a sufficiently large prime number and check that the results exceeds our target I (10^{10} in this case). So, I guessed by using a list of primes at the 22044^{th} prime number 249,989 with a remainder of 2*22044*249989 = 11021515032. That's greater then 10^{10} and will suffice.
from Euler import prime_sieve
def pe123(L=10**10, ni=7039):
primes = [0] + prime_sieve(250000) # base prime number array from one
for n in range(ni, len(primes), 2):
if 2 * n * primes[n] > L:
return n
return None
print "First n for remainder to exceed limit:", pe123()
Use this link to get the Project Euler 123 Solution Python 2.7 source.The post Project Euler 123 Solution appeared first on Dreamshire.
]]>The post Project Euler 116 Solution appeared first on Dreamshire.
]]>A row of five black square tiles is to have a number of its tiles replaced with coloured oblong tiles chosen from red (length two), green (length three), or blue (length four).
If red tiles are chosen there are exactly seven ways this can be done.
If green tiles are chosen there are three ways.
And if blue tiles are chosen there are two ways.
Assuming that colours cannot be mixed there are 7 + 3 + 2 = 12 ways of replacing the black tiles in a row measuring five units in length.
How many different ways can the black tiles in a row measuring fifty units in length be replaced if colours cannot be mixed and at least one coloured tile must be used?
NOTE: This is related to Problem 117.
As a continuation from the two previous problems we remove the empty space option and one-space tile separation requirement. Now it makes sense to include a function since we are adding 3 different fixed-length tiles of sizes 2, 3 and 4.
The post Project Euler 116 Solution appeared first on Dreamshire.
]]>The post Project Euler 115 Solution appeared first on Dreamshire.
]]>NOTE: This is a more difficult version of Problem 114.
A row measuring n units in length has red blocks with a minimum length of m units placed on it, such that any two red blocks (which are allowed to be different lengths) are separated by at least one black square.
Let the fill-count function, F(m, n), represent the number of ways that a row can be filled.
For example, F(3, 29) = 673135 and F(3, 30) = 1089155.
That is, for m = 3, it can be seen that n = 30 is the smallest value for which the fill-count function first exceeds one million.
In the same way, for m = 10, it can be verified that F(10, 56) = 880711 and F(10, 57) = 1148904, so n = 57 is the least value for which the fill-count function first exceeds one million.
For m = 50, find the least value of n for which the fill-count function first exceeds one million.
This problem could easily be solved by playing with the interactive solution on the Problem 114 page. Just change m to 50 and play with n until it first exceeeds one million. The value of n won't be very big because we start m at 50.
Again, i opted out of a recursive solution or generating functions because, after a while, dynamic programming becomes so intuitive for solving counting problems.
Also, I didn't bother with an F()
function as I wanted to simply make a few changes to the previous problem and finish it. Instead of a fixed-size array, I dynamically increase it as necessary since I have no clue as to how big it should be to start with.
Well, actually, I do have a clue, but not if the parameters of this problem were changed.
The post Project Euler 115 Solution appeared first on Dreamshire.
]]>The post Project Euler 114 Solution appeared first on Dreamshire.
]]>A row measuring seven units in length has red blocks with a minimum length of three units placed on it, such that any two red blocks (which are allowed to be different lengths) are separated by at least one black square. There are exactly seventeen ways of doing this.
How many ways can a row measuring fifty units in length be filled?
NOTE: Although the example above does not lend itself to the possibility, in general it is permitted to mix block sizes. For example, on a row measuring eight units in length you could use red (3), black (1), and red (4).
For the purpose of this discussion, the unit size of the space into which blocks (red) are placed is identified as n and the unit size of the red blocks, with a range in size from 3 to n, is identified as m. Also, an empty space void of any red blocks is counted.
This is a counting problem, so dynamic programming and its hand maiden linear programming come immediately to mind and usurp the notion of trying a brute-force solution.
And as far as examples go, 7 wasn't the best choice as the problem admits, but it will suffice to answer the problem.
My first analogy was shifting groups of bits in a computer's register, but here's a more festive idea. I looked at this problem like a game of Tetris (Play a game online here). This is a much simpler version as there is only one dropping shape, a "line" with a minimum size of 3 units. Let's look at the example graphic twisted slightly to show my thought process:
The only constraint is that no falling shapes can ever touch; they must be separated by at least one empty space.
As the red blocks fall the only variable is the length of the block, m; between 3 and 7. When we move to n = 8, this same configuration for n = 7 will be a subset of it. Just like n = 6 is a subset of n = 7.
In fact, to demonstrate this concept, lets try to calculate the number of ways we can fill 6 spaces:
How many survived the butchery? Change the variable n in the program to 6 and run it. Did it match your count?
By now, you could add a tile to our graphic and learn the count for 8 spaces. Soon a pattern would become obvious and a dynamic solution is born.
It's just adding a series of numbers for each n as it increase from 3 through 50. Yes, a function (with binomial tendencies) exists out there that would always put to rest a dynamic programming solution for counting, but why spoil the fun.
from Euler import binomial as C n = 50 + 1 print sum(C(n - 2*k, 2*k) for k in range(int(n/4)+1))
The post Project Euler 114 Solution appeared first on Dreamshire.
]]>The post Project Euler 117 Solution appeared first on Dreamshire.
]]>Using a combination of black square tiles and oblong tiles chosen from: red tiles measuring two units, green tiles measuring three units, and blue tiles measuring four units, it is possible to tile a row measuring five units in length in exactly fifteen different ways.
How many ways can a row measuring fifty units in length be tiled?
NOTE: This is related to Problem 116.
As the simplest solution for the problem set requium, we make a small change to problem 116 by allowing multiple tiles of length 2, 3 and 4 to share the space.
The post Project Euler 117 Solution appeared first on Dreamshire.
]]>The post Project Euler 139 Solution appeared first on Dreamshire.
]]>Let (a, b, c) represent the three sides of a right angle triangle with integral length sides. It is possible to place four such triangles together to form a square with length c.
For example, (3, 4, 5) triangles can be placed together to form a 5 by 5 square with a 1 by 1 hole in the middle and it can be seen that the 5 by 5 square can be tiled with twenty-five 1 by 1 squares.
However, if (5, 12, 13) triangles were used then the hole would measure 7 by 7 and these could not be used to tile the 13 by 13 square.
Given that the perimeter of the right triangle is less than one-hundred million, how many Pythagorean triangles would allow such a tiling to take place?
The paper "Tiling with Pythagorean Triples" offers a journey through the rough streets of brute forcing to the tranquil avenue of Pell's equation. The following discussion paraphrases this excellent discussion in an effort to summarize my solution.
Using Euclid's formula, the tiling condition can be expressed as:
We can rearrange and group the terms, and define two new variables, to transform the equation:
Since m and n are positive integers, with m > n , it follows from the above that x and y will also be positive integers. Given that, the last version of the tiling condition fits the Pell's equation form of Diophantine equations.
A Diophantine equation is a polynomial equation with the added constraint that only integer solutions are allowed; Pell's equation is a specific form of Diophantine equation.
Jump over to Dario's site and solve the Diophantine equation as:
The post Project Euler 139 Solution appeared first on Dreamshire.
]]>The post Project Euler 231 Solution appeared first on Dreamshire.
]]>The binomial coefficient ^{10}C_{3} = 120. ,
120 = 2^{3} ×3 ×5 = 2 × 2 × 2 × 3 × 5, and 2 + 2 + 2 + 3 + 5 = 14.
So the sum of the terms in the prime factorisation of ^{10}C_{3} is 14.
Find the sum of the terms in the prime factorisation of ^{20000000}C_{15000000}.
Calculating the binomial in this problem and factoring it would take too long so another method had to be discovered.
The paper "Prime Factors of Binomial Coefficients" by Samin Riasat explains Legendre's theorem for finding the prime factors and their exponents for factorials and this extends nicely to binomial coefficients.
An application of Legendre's theorem is to find how many zeros are there at the end of a factorial.
Let's say you want to find the number of zeros at the end of 1000! You just need to find how many times the factors 2 AND 5 (because 2 × 5 = 10) appear in the prime factorization of 1000!. Since 2 factors many more numbers without 5 but is always required with 5 in order to count the zeros we just concern ourselves with 5. To paraphrase the paper:
More generally:
This method was used to solve SPOJ 11 Trailing zeros in a factorial.
Below: Legendre's extension used in the program's loop to calculate the prime's exponent, if it's a factor. Evaluates to either 1 or 0 and then summed:
I wanted to further improve performance and studied Kummer's method for calculating the exponents of the prime factors but it didn't seem like it would make it any faster.
from Euler import prime_sieve
n, r, s = 20000000, 15000000, 0
for p in prime_sieve(n):
pj = p
while pj <= n:
s += p * (n//pj - r//pj - (n - r)//pj)
pj *= p
print "Project Euler 231 Solution =", s
Use this link to get the Project Euler 231 Solution Python 2.7 source.The post Project Euler 231 Solution appeared first on Dreamshire.
]]>The post Project Euler 455 Solution appeared first on Dreamshire.
]]>Let f(n) be the largest positive integer x less than 10^{9} such that the last 9 digits of n^{x} form the number x (including leading zeros), or zero if no such integer exists.
For example:
Find Σf(n), 2 ≤ n ≤ 10^{6}.
Well, just follow the instructions and employ Pypy to get it to run under 1 minute. This is not much different from other problems that deal with large numbers where the pow() function and the third modulus parameter are used.
I should work on improving the algorithm so I wouldn't need Pypy to bail me out of a time constraint. It takes about 67 seconds in Python.
L, s = 1000000, 0
for n in xrange(2, L):
x0, x1 = 0, n
while x0 != x1 and x1:
x0, x1 = x1, pow(n, x0, 10**9)
s += x1
print "Project Euler 455 Solution =", s
Use this link to get the Project Euler 455 Solution Pypy source.The post Project Euler 455 Solution appeared first on Dreamshire.
]]>