带TLA +的isPrime函数

时间:2018-11-17 23:26:24

标签: primes tla+

这个问题是关于使用工具箱(https://github.com/tlaplus/tlaplus/releases)的TLA + 我尚未找到有关它的任何标签。对于那个很抱歉。这就是为什么我只标记了Primes的原因。如果我缺少某些标签,请添加更好的标签或创建缺少的标签。

这是问题

GCD有一个众所周知的功能和算法。在这里。

------------------ MODULE Euclid -------------------------------
EXTENDS Naturals, TLC
CONSTANT K
Divides(i,j) == \E k \in 0..j: j = i * k
IsGCD(i,j,k) ==
    Divides(i,j)
    /\ Divides(i,k)
    /\ \A r \in 0..j \cup 0..k :
        (Divides(r,j ) /\ Divides(r,k)) => Divides(r,i)
    (* --algorithm EuclidSedgewick
    {
        variables m \in 1..K, n \in 1..m, u = m, v = n;
        {
            L1: while (u # 0) {
            if (u < v) { u := v || v := u };
            L2: u := u - v
            };
            assert IsGCD(v, m, n)
        }
    }
    *)

这是一个众所周知的解决方案,正在起作用。

我现在正尝试使用此函数编写一个isPrime函数。但是我认为我在做什么是错误的。我想知道你是否有想法。

isPrime(nb) ==
        \E k \in 2..nb: isGCD(nb,k,1) \/ isGCD(nb,k,nb)

谢谢

1 个答案:

答案 0 :(得分:1)

有很多表达整数为素数的概念的方法,但是您尝试说如果在2..N中存在某个整数k且gcd(k,n)= 1或则整数N为素数。 gcd(k,n)= n。很容易看出这是不正确的,因为显然4是合成的,但gcd(3,4)=1。当然,无论是否有N个素数,gcd(N,N)= N。

我不确定TLA +的规则,但是我快速阅读了一些文档,这是我在IsPrime的尝试

isPrime(nb) == \A k in 2..nb-1: ~Divides(k, nb)

isPrime(nb) == \A k in 1..nb: Divides(k, nb) => ( (k = 1) \/ (k=nb) )

或者,如果您出于某些原因真的想在其中使用IsGCD

isPrime(nb) == \A k in 1..nb: IsGCD(k, nb, d) => ( (d = 1) \/ (d = nb) )

isPrime(nb) == \A k in 2..nb-1: IsGCD(k, nb, d) => (d = 1)