Простые числа на протяжении веков интересовали математиков и программистов. В этой статье блога мы углубимся в мир генерации простых чисел с использованием языка программирования COBOL. Мы изучим различные методы, обсудим их реализацию в COBOL и проверим их вычислительную эффективность.
Метод 1: грубый перебор
Самый простой способ определить, является ли число простым, — это проверить, делится ли оно на любое число, кроме 1 и самого себя. В COBOL мы можем реализовать этот метод, используя вложенные циклы и переменную-флаг.
IDENTIFICATION DIVISION.
PROGRAM-ID. PRIME-BRUTE-FORCE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUMBER PIC 9(5).
01 IS-PRIME PIC X(3) VALUE 'YES'.
01 I PIC 9(5).
01 J PIC 9(5).
PROCEDURE DIVISION.
ACCEPT NUMBER
PERFORM CHECK-PRIME
DISPLAY 'Is prime? ' IS-PRIME
STOP RUN.
CHECK-PRIME.
PERFORM VARYING I FROM 2 BY 1 UNTIL I > NUMBER / 2
IF NUMBER MOD I = 0
MOVE 'NO' TO IS-PRIME
EXIT PERFORM
END-IF
END-PERFORM.
Метод 2: Решето Эратосфена
Решето Эратосфена — это эффективный алгоритм для генерации простых чисел до заданного предела. Он работает путем итеративного вычеркивания кратных каждому найденному простому числу. Ниже представлена реализация этого алгоритма на языке COBOL.
IDENTIFICATION DIVISION.
PROGRAM-ID. PRIME-SIEVE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 LIMIT PIC 9(5).
01 PRIME-TABLE OCCURS 0 TO 9999 TIMES DEPENDING ON LIMIT.
05 IS-PRIME PIC X(3) VALUE 'YES'.
PROCEDURE DIVISION.
ACCEPT LIMIT
PERFORM GENERATE-PRIMES
DISPLAY 'Prime numbers up to ' LIMIT ':'
PERFORM DISPLAY-PRIMES
STOP RUN.
GENERATE-PRIMES.
PERFORM VARYING I FROM 2 BY 1 UNTIL I * I <= LIMIT
IF IS-PRIME(I) = 'YES'
PERFORM VARYING J FROM I * I BY I UNTIL J > LIMIT
MOVE 'NO' TO IS-PRIME(J)
END-PERFORM
END-IF
END-PERFORM.
DISPLAY-PRIMES.
PERFORM VARYING I FROM 2 BY 1 UNTIL I <= LIMIT
IF IS-PRIME(I) = 'YES'
DISPLAY I
END-IF
END-PERFORM.
Метод 3: тест на простоту Миллера-Рабина
Тест на простоту Миллера-Рабина — это вероятностный алгоритм, позволяющий быстро определить, является ли число составным или, скорее всего, простым. Он выполняет несколько итераций теста для повышения точности. Вот пример реализации теста Миллера-Рабина в COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. PRIME-MILLER-RABIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUMBER PIC 9(5).
01 ITERATIONS PIC 9(2) VALUE 10.
01 IS-PRIME PIC X(3) VALUE 'YES'.
PROCEDURE DIVISION.
ACCEPT NUMBER
PERFORM MILLER-RABIN-TEST
DISPLAY 'Is prime? ' IS-PRIME
STOP RUN.
MILLER-RABIN-TEST.
PERFORM VARYING I FROM 1 BY 1 UNTIL I <= ITERATIONS
IF NOT MILLER-RABIN-PASS(NUMBER)
MOVE 'NO' TO IS-PRIME
EXIT PERFORM
END-IF
END-PERFORM.
MILLER-RABIN-PASS.
...
(Implement the Miller-Rabin primality test logic here)
...
В этой статье мы рассмотрели три различных метода генерации простых чисел в COBOL. Метод грубой силы прост, но требует больших вычислительных затрат. Решето Эратосфена — это высокоэффективный алгоритм генерации простых чисел до заданного предела. Тест на простоту Миллера-Рабина обеспечивает вероятностный подход для определения того, является ли число простым. В зависимости от требований вашей программы COBOL вы можете выбрать наиболее подходящий метод.
Поняв и внедрив эти методы генерации простых чисел в COBOL, вы сможете раскрыть возможности этого исторического языка программирования для эффективного решения математических задач.