БлогNot. Простое число или особенности цикла for в Mathcad

Простое число или особенности цикла for в Mathcad

Для иллюстрации применения в Mathcad так называемого цикла типа арифметической прогрессии (обычного цикла for) напишем функцию, определяющую, является ли простым заданное натуральное число n:

Функция проверки на простое число в MathCAD
Функция проверки на простое число в MathCAD

Она предполагает, что переданное ей число n – простое (присваивает переменной r значение 1), а затем последовательно проверяет остатки от деления n на значения 2, 3, …, корень(n) – остатки от деления на 1 и n проверять нет смысла, а если число не простое, ни один из его двух целочисленных сомножителей не может быть больше квадратного корня из числа (5*5=25 и 5 равно корню из 25, а числа, на которое 25 бы делилось нацело, большего 5, не существует).

Остаток от деления нацело значения n на значение i можно найти с помощью стандартной функции mod(n,i). Если найден хотя бы один остаток, равный нулю, функция Simple записывает возвращаемое значение r=0 и прерывает цикл проверок, в противном случае значение r остаётся равным 1, как оно и было назначено до цикла.

Протестировать нашу функцию можно, если написать ещё одну функцию, формирующую вектор из всех простых чисел, не превышающих заданного значения N:

Все простые числа, не превышающие заданного N - реализация в Mathcad
Все простые числа, не превышающие заданного N - реализация в Mathcad

Как видим, наша функция Simple неверна – например, она не считает простыми числа 2 и 3. Проблема состоит в том, что цикл for будет выполняться, даже если начальное значение параметра цикла больше конечного и шаг цикла равен 1 (по умолчанию). Например, для n=2 граница цикла floor(корень(2))=1 и цикл, проверив остатки от деления n=2 на 2 и 1, равные нулю, решит, что число 2 – не простое.

Правильно будет реализовать внутренний цикл через оператор while:

Все простые числа, не превышающие заданного N - реализация через while
Все простые числа, не превышающие заданного N - реализация через while

или задать для цикла for явный шаг, равный +1:

Все простые числа, не превышающие заданного N - реализация в MathCAD
Все простые числа, не превышающие заданного N - реализация в MathCAD

В последнем варианте функции числа 2 и 3 пришлось обработать отдельно, чтобы избежать ошибки «Необходимо определить переменную-диапазон с последовательными значениями» - в этом случае она возникнет, если значение floor(корень(n)) окажется меньше трёх.

Второй интересный момент - в классическом цикле for в Mathcad, как известно, справа от знака ∈ обычно ставят дискретный аргумент:

for i ∈ 1..10
 ...

Однако Маткад позволяет поставить вместо дискретной переменной справа от знака ∈ вектор или матрицу. Более того, можно туда поставить список векторов или матриц, перечисленных через запятую. Скалярная переменная слева от знака ∈ по очереди примет значение каждого элемента каждой не-скалярной величины в порядке перечисления. На показанном ниже скриншоте видно, как с помощью переменной i (и счётчика элементов k) программно формируется вектор x из всех положительных элементов векторов-параметров A и B.

Список векторов в программном цикле for MathCAD
Список векторов в программном цикле for MathCAD

12.03.2013, 17:08 [14523 просмотра]


теги: числа алгоритм mathcad

К этой статье пока нет комментариев, Ваш будет первым