Personal tools

Euler problems/181 to 190

From HaskellWiki

< Euler problems(Difference between revisions)
Jump to: navigation, search
((183) If we must have a solution here, let's at least have a decent one.)
Line 27: Line 27:
 
Solution:
 
Solution:
 
<haskell>
 
<haskell>
pmax x a=a*(log x-log a)
+
-- Does the decimal expansion of p/q terminate?
tofloat x=encodeFloat x 0
+
terminating p q = 1 == reduce [2,5] (q `div` gcd p q)
fun x=
+
where reduce [] n = n
div n1 $gcd n1 x
+
reduce (x:xs) n | n `mod` x == 0 = reduce (x:xs) (n `div` x)
where
+
| otherwise = reduce xs n
e=exp 1
+
n=floor(fromInteger x/e)
+
-- The expression (round $ fromIntegral n / e) computes the integer k
n1=snd.maximum$[(b,a)|a<-[n..n+1],let b=pmax (tofloat x) (tofloat a)]
+
-- for which (n/k)^k is at a maximum.
n `splitWith` p = doSplitWith 0 n
+
answer = sum [if terminating n (round $ fromIntegral n / e) then -n else n
where doSplitWith s t
+
| n <- [5 .. 10^4]]
| p `divides` t = doSplitWith (s+1) (t `div` p)
+
where e = exp 1
| otherwise = (s, t)
+
d `divides` n = n `mod` d == 0
+
main = print answer
funD x
 
|is25 k=(-x)
 
|otherwise =x
 
where
 
k=fun x
 
is25 x
 
|s==1=True
 
|otherwise=False
 
where
 
s=snd(splitWith (snd (splitWith x 2)) 5)
 
problem_183 =sum[funD a|a<- [5..10000]]
 
 
</haskell>
 
</haskell>

Revision as of 20:27, 24 February 2008

1 Problem 181

Investigating in how many ways objects of two different colours can be grouped.

Solution: This was my code, published here without my permission nor any attribution, shame on whoever put it here. Daniel.is.fischer

2 Problem 182

RSA encryption.

Solution:

fun a1 b1 =
    sum [ e |
    e <- [2..a*b-1],
    gcd e (a*b) == 1,
    gcd (e-1) a == 2,
    gcd (e-1) b == 2
    ]
    where
    a=a1-1
    b=b1-1
problem_182=fun 1009 3643

3 Problem 183

Maximum product of parts.

Solution:

-- Does the decimal expansion of p/q terminate?
terminating p q = 1 == reduce [2,5] (q `div` gcd p q)
        where reduce   []   n = n
              reduce (x:xs) n | n `mod` x == 0 = reduce (x:xs) (n `div` x)
                              | otherwise      = reduce xs n
 
-- The expression (round $ fromIntegral n / e) computes the integer k
-- for which (n/k)^k is at a maximum.
answer = sum [if terminating n (round $ fromIntegral n / e) then -n else n
                | n <- [5 .. 10^4]]
        where e = exp 1
 
main = print answer