Я совершенно не разбираюсь в теории чисел, а это означает, что при кодировании способа найти наименьшее общее кратное двух целых чисел (я сознательно считаю отрицательные числа) я упустил хорошие уловки, такие как использование алгоритма Евклида. и использовал только хорошо известную формулу «lcm (a, b) = | a * b | / gcd (a, b)». Это также означало, что я использовал очень необычный подход для поиска lcm, который я не видел в другом месте:
lcm<-function(m,n)
{
if(n==0||m==0){return(0)}
gcd<-max(intersect(allDivisors(m),allDivisors(n)))
abs(m*n)/gcd
}
allDivisors<-function(n)
{
positiveDivisors<-function(n){union(Filter(function(x) n%%x==0,1:(n%/%2)),n)}
return(c(-positiveDivisors(n),positiveDivisors(n)))
}
Несмотря на то, что он намного медленнее, чем алгоритм Евклида, я думаю, что этот код довольно чистый и демонстрирует хороший функциональный подход, который я не мог найти в другом месте, даже когда искал решения на функциональных языках. Однако, поскольку этот код необычный, и я не знаю своей теории чисел, я не могу быть уверен, действительно ли он работает. Для более опытного глаза, есть ли случаи, когда он явно упускает или терпит неудачу?