Smallest multiple: Difference between revisions
Content added Content deleted
(→{{header|Python}}: Second version no longer needed – first has switched to integer division and no longer errors with higher values.) |
|||
Line 518: | Line 518: | ||
for i in [10, 20, 200, 2000]: |
for i in [10, 20, 200, 2000]: |
||
print(str(i) + ':', reduce(lcm, range(1, i + 1))) |
print(str(i) + ':', reduce(lcm, range(1, i + 1)))</lang> |
||
{{out}} |
|||
<pre> |
<pre>10: 2520 |
||
10: 2520 |
|||
20: 232792560 |
20: 232792560 |
||
200: 337293588832926264639465766794841407432394382785157234228847021917234018060677390066992000 |
200: 337293588832926264639465766794841407432394382785157234228847021917234018060677390066992000 |
||
2000: 151117794877444315307536308337572822173736308853579339903227904473000476322347234655122160866668946941993951014270933512030194957221371956828843521568082173786251242333157830450435623211664308500316844478617809101158220672108895053508829266120497031742749376045929890296052805527212315382805219353316270742572401962035464878235703759464796806075131056520079836955770415021318508272982103736658633390411347759000563271226062182345964184167346918225243856348794013355418404695826256911622054015423611375261945905974225257659010379414787547681984112941581325198396634685659217861208771400322507388161967513719166366839894214040787733471287845629833993885413462225294548785581641804620417256563685280586511301918399010451347815776570842790738545306707750937624267501103840324470083425714138183905657667736579430274197734179172691637931540695631396056193786415805463680000 |
2000: 151117794877444315307536308337572822173736308853579339903227904473000476322347234655122160866668946941993951014270933512030194957221371956828843521568082173786251242333157830450435623211664308500316844478617809101158220672108895053508829266120497031742749376045929890296052805527212315382805219353316270742572401962035464878235703759464796806075131056520079836955770415021318508272982103736658633390411347759000563271226062182345964184167346918225243856348794013355418404695826256911622054015423611375261945905974225257659010379414787547681984112941581325198396634685659217861208771400322507388161967513719166366839894214040787733471287845629833993885413462225294548785581641804620417256563685280586511301918399010451347815776570842790738545306707750937624267501103840324470083425714138183905657667736579430274197734179172691637931540695631396056193786415805463680000</pre> |
||
</pre> |
|||
Or, defining '''lcm''' a little differently: |
|||
<lang python>'''Smallest multiple''' |
|||
from math import gcd |
|||
from functools import reduce |
|||
# smallestEvenlyDivisibleByOneToN :: Integer -> Integer |
|||
def smallestEvenlyDivisibleByOneToN(n): |
|||
'''The smallest positive integer this is evenly |
|||
divisible by all of the integers in [1..N] |
|||
''' |
|||
return reduce( |
|||
uncurry(lcm), |
|||
range(1, 1 + n) |
|||
) |
|||
# ------------------------- TEST ------------------------- |
|||
# main :: IO () |
|||
def main(): |
|||
'''Tests for n drawn from {10, 20, 200}''' |
|||
xs = [10, 20, 200, 2000] |
|||
w = len(str(max(xs))) |
|||
print( |
|||
'\n'.join([ |
|||
f'{n:>{w}} -> {smallestEvenlyDivisibleByOneToN(n)}' |
|||
for n in xs |
|||
]) |
|||
) |
|||
# ----------------------- GENERIC ------------------------ |
|||
# lcm :: Int -> Int -> Int |
|||
def lcm(x): |
|||
'''The smallest positive integer divisible |
|||
without remainder by both x and y. |
|||
''' |
|||
def go(y): |
|||
return 0 if (0 == x or 0 == y) else abs( |
|||
y * (x // gcd(x, y)) |
|||
) |
|||
return go |
|||
# uncurry :: (a -> b -> c) -> ((a, b) -> c) |
|||
def uncurry(f): |
|||
'''A function over a tuple, |
|||
derived from a curried function. |
|||
''' |
|||
def go(*ab): |
|||
return f(ab[0][0])(ab[0][1]) if ( |
|||
1 == len(ab) |
|||
) else f(ab[0])(ab[1]) |
|||
return go |
|||
# MAIN --- |
|||
if __name__ == '__main__': |
|||
main()</lang> |
|||
{{Out}} |
|||
<pre> 10 -> 2520 |
|||
20 -> 232792560 |
|||
200 -> 337293588832926264639465766794841407432394382785157234228847021917234018060677390066992000 |
|||
2000 -> 151117794877444315307536308337572822173736308853579339903227904473000476322347234655122160866668946941993951014270933512030194957221371956828843521568082173786251242333157830450435623211664308500316844478617809101158220672108895053508829266120497031742749376045929890296052805527212315382805219353316270742572401962035464878235703759464796806075131056520079836955770415021318508272982103736658633390411347759000563271226062182345964184167346918225243856348794013355418404695826256911622054015423611375261945905974225257659010379414787547681984112941581325198396634685659217861208771400322507388161967513719166366839894214040787733471287845629833993885413462225294548785581641804620417256563685280586511301918399010451347815776570842790738545306707750937624267501103840324470083425714138183905657667736579430274197734179172691637931540695631396056193786415805463680000</pre> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |