首先,我几乎是全新的函数式编程(以及一般的编程),所以如果这看起来像一个愚蠢的问题,我会提前道歉。无论如何,到目前为止,我一直在做一些编程练习并且做得很好,但是这个让我陷入困境:
我需要创建一个函数,fn:int - > int,对于n> 0找到最小的m> n,使得m和n 不相对素数。 这是我到目前为止所做的:
(* returns true if p,q are relative primes, else false *)
fun relativePrimes (1,q) = true
| relativePrimes (p,q) = if p <> 0 then relativePrimes(q mod p,p) else false;
我在
中使用此功能fun nextNotRelativePrime n = if relativePrimes (n,n+1) = false then n+1
else if relativePrimes (n,n+2) = false then n+2 else n*2; (* and so on... *)
这里的问题是这个函数只适用于n&lt; = 9.当然,我可以用更多的情况来扩展它,但它仍然不适用于所有n。
我需要一种方法在relativePrimes(p,q)中将n向上递增1(对于n * 2),而每次调用函数时p = n保持不变。我不知道怎么回事。
答案 0 :(得分:2)
要在循环中实现搜索,您需要一个辅助函数,并将循环索引作为附加参数。
至于数学问题,解决问题的最佳方法如下:
找出p
的最小素数因子m
,然后让n = m + p
。
要查找p
,您可以使用试验区,直至并包括m
的平方根。如果您没有找到因素,那么m
就是素数p = m
。
有一些更好的方法可以在没有小的素数因子的情况下分解大m
,例如Brent's variant of Pollard's rho algorithm