pb 66 solution

This commit is contained in:
Yann Esposito (Yogsototh) 2011-12-19 17:55:33 +01:00
parent ee17b385c6
commit 47a1f0404a

46
066.hs Normal file
View file

@ -0,0 +1,46 @@
-- Consider quadratic Diophantine equations of the form:
--
-- x^2 Dy^2 = 1
--
-- For example, when D=13, the minimal solution in x is 6492 13×1802 = 1.
--
-- It can be assumed that there are no solutions in positive integers when D is square.
--
-- By finding minimal solutions in x for D = {2, 3, 5, 6, 7}, we obtain the following:
--
-- 32 2×22 = 1
-- 22 3×12 = 1
-- 92 5×42 = 1
-- 52 6×22 = 1
-- 82 7×32 = 1
--
-- Hence, by considering minimal solutions in x for D ≤ 7, the largest x is obtained when D=5.
--
-- Find the value of D ≤ 1000 in minimal solutions of x for which the largest value of x is obtained.
import Control.Monad
import Data.List
import Data.Maybe
isqrt = floor . sqrt . fromIntegral
isSquare d = (isqrt d)^2 == d
hasSolution d x =
let y = isqrt (( x^2 - 1 ) `div` d)
in x^2 - (y^2)*d == 1
phead [] = -2
phead (x:xs) = x
sol d = if isSquare d
then -1
else phead $ filter (hasSolution d) [2..1000000]
main = let
lst = map sol [2..1000]
maxelem = foldl' (\x y -> if x>y then x else y) 0 lst
in do
forM_ [2..1000] (\d -> do putStr $ (show d) ++ " -> "; print $ lst !! d)
print maxelem
print $ elemIndex maxelem lst