131 lines
3.2 KiB
Haskell
131 lines
3.2 KiB
Haskell
import Debug.Trace (trace)
|
|
import Graphics.Rendering.Chart.Backend.Cairo
|
|
import Graphics.Rendering.Chart.Easy
|
|
{-
|
|
Special Pythagorean Triplet
|
|
Problem 9
|
|
|
|
A Pythagorean triplet is a set of three natural numbers, `a < b < c`, for which,
|
|
|
|
`a^2 + b^2 = c^2`.
|
|
|
|
For example, `3^2 + 4^2 = 9 + 16 = 25 = 5^2`.
|
|
|
|
There exists exactly one Pythagorean triplet for which `a + b + c = 1000`.
|
|
|
|
Find the product `abc`.
|
|
-}
|
|
|
|
main :: IO ()
|
|
main = do
|
|
print answer
|
|
print (product answer)
|
|
|
|
-- head $ [(a,b,c) | a <- [1..limit], b <- [a+1..limit], c <- [limit - a - b], a < b, b < c, a^2 + b^2 == c^2]
|
|
answer :: [Integer]
|
|
answer = head $
|
|
[ [a, b, c] |
|
|
a <- [1 .. limit],
|
|
b <- [a + 1 .. limit],
|
|
c <- [limit - a - b],
|
|
b < c,
|
|
a ^ 2 + b ^ 2 == c ^ 2]
|
|
where limit = 1000
|
|
|
|
limit = 1000
|
|
version1 = [ [a, b, c] |
|
|
a <- [1 .. limit],
|
|
b <- [a + 1 .. limit],
|
|
c <- [limit - a - b],
|
|
b < c,
|
|
a ^ 2 + b ^ 2 == c ^ 2]
|
|
|
|
version2 = [ [a, b, c] |
|
|
a <- [1 .. limit],
|
|
b <- [a + 1 .. limit],
|
|
c <- [limit - a - b],
|
|
b < c,
|
|
a ^ 2 + b ^ 2 == c ^ 2]
|
|
|
|
|
|
solve :: Integer -> [(Integer, Integer, Integer)]
|
|
solve x = takeWhile (\(a,b,c) -> a + b + c == 1000) $ primitiveTriplesUnder x
|
|
|
|
euclid'sFormula :: Num c => (c, c) -> (c, c, c)
|
|
euclid'sFormula (m, n) = (a,b,c)
|
|
where
|
|
a = m^2 - n^2
|
|
b = 2*m*n
|
|
c = m^2 + n^2
|
|
|
|
listOfMNs :: Integer -> [(Integer, Integer)]
|
|
listOfMNs x =
|
|
[ (m,n)
|
|
| n <- [2,4..x] -- one of them is even
|
|
, m <- [n+1,n+3..x]
|
|
, gcd m n == 1 -- coprime
|
|
]
|
|
|
|
listOfMNs' :: Integer -> [(Integer, Integer)]
|
|
listOfMNs' x =
|
|
[ (m,n)
|
|
| n <- [2,4..] -- one of them is even
|
|
, m <- [n+1,n+3..]
|
|
, gcd m n == 1 -- coprime
|
|
, a m n + b m n + c m n <= x
|
|
] where
|
|
a m n = m^2 - n^2
|
|
b m n = 2*m*n
|
|
c m n = m^2 + n^2
|
|
|
|
|
|
primitiveTriplesUnder :: Integer -> [(Integer, Integer, Integer)]
|
|
primitiveTriplesUnder = map euclid'sFormula . listOfMNs
|
|
|
|
|
|
test :: [(Integer, Integer, Integer)]
|
|
test = [ (a,b,c)
|
|
| a <- [3..],
|
|
b <- take 10 [a+1..],
|
|
c <- takeWhile (\c -> a^2 + b^2 <= c^2) [b+1..]
|
|
]
|
|
|
|
ls :: [(Integer, Integer)]
|
|
ls = filter (\(m,n) -> gcd m n == 1) $ zip [5,9..] [2,4..]
|
|
|
|
diags :: Integer -> [(Integer, Integer)]
|
|
diags n = [(x,y) | x<-[0..n], y<-[0..n]]
|
|
|
|
|
|
graph :: IO ()
|
|
graph = toFile def "test.png" $ do
|
|
layout_title .= "Points"
|
|
plot (line "points" [ [ (x,y) | (x,y) <- listOfMNs 30] ])
|
|
|
|
|
|
-- main'' = print ans'
|
|
ans' :: Integer -> [(Integer, Integer, Integer)]
|
|
ans' limit = [(a, b, c)
|
|
| a <- [1 .. limit]
|
|
, b <- [a + 1 .. limit]
|
|
, c <- [limit - a - b]
|
|
, b < c
|
|
]
|
|
|
|
{-
|
|
- Solution to Project Euler problem 9
|
|
- Copyright (c) Project Nayuki. All rights reserved.
|
|
-
|
|
- https://www.nayuki.io/page/project-euler-solutions
|
|
- https://github.com/nayuki/Project-Euler-solutions
|
|
-}
|
|
|
|
|
|
-- -- Computers are fast, so we can implement a brute-force search to directly solve the problem.
|
|
-- perim = 1000
|
|
-- main = putStrLn (show ans)
|
|
-- ans = head [a * b * (perim - a - b) | a <- [1..perim], b <- [a+1..perim], isIntegerRightTriangle a b]
|
|
-- isIntegerRightTriangle a b = a < b && b < c
|
|
-- && a * a + b * b == c * c
|
|
-- where c = perim - a - b
|