Функция isPrime с TLA +

Этот вопрос касается TLA + с использованием набора инструментов (https://github.com/tlaplus/tlaplus/releases) Мне не удалось найти ни одной отметки об этом. Извини за это. Вот почему я выбрал только простые числа. Если мне чего-то не хватает, пожалуйста, добавьте лучшие теги или создайте недостающие.

Вот в чем проблема

Есть хорошо известная функция и алгоритм для НОД. Вот.

------------------ 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)

Спасибо


person Minirock    schedule 17.11.2018    source источник


Ответы (1)


Есть много способов выразить представление о том, что целое число является простым, однако ваша попытка говорит, что целое число N является простым, если существует некоторое целое число k в 2..N, для которого НОД (k, n) = 1 или НОД (k , n) = n. Легко увидеть, что это неверно, поскольку 4 явно составное, но НОД (3,4) = 1. И, конечно, для любого N простого числа или нет, НОД (N, N) = N.

Я не уверен в правилах TLA +, но я быстро прочитал некоторую документацию, и вот моя попытка в IsPrime

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

or

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) )

or

isPrime(nb) == \A k in 2..nb-1: IsGCD(k, nb, d) => (d = 1)
person President James K. Polk    schedule 18.11.2018