找到最小m>的函数。 n使得m和n不是相对素数

时间:2013-09-08 14:03:31

标签: functional-programming primes sml

首先,我几乎是全新的函数式编程(以及一般的编程),所以如果这看起来像一个愚蠢的问题,我会提前道歉。无论如何,到目前为止,我一直在做一些编程练习并且做得很好,但是这个让我陷入困境:

我需要创建一个函数,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保持不变。我不知道怎么回事。

1 个答案:

答案 0 :(得分:2)

要在循环中实现搜索,您需要一个辅助函数,并将循环索引作为附加参数。

至于数学问题,解决问题的最佳方法如下:

找出p的最小素数因子m,然后让n = m + p

要查找p,您可以使用试验区,直至并包括m的平方根。如果您没有找到因素,那么m就是素数p = m

有一些更好的方法可以在没有小的素数因子的情况下分解大m,例如Brent's variant of Pollard's rho algorithm