Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Mathematica / Глава 5. Простые целые числа

.pdf
Скачиваний:
53
Добавлен:
30.05.2015
Размер:
367.7 Кб
Скачать

Приведем описание алгоритма метода пробных делений на 2 и все нечетные числа, большие двух.

Алгоритм 3.2. (метод пробных делений). Дано целое число n > 1. Алгоритм создает мультимножество S простых делителей числа n. (Термин «мультимножество» означает, что элементы этого множества могут повторяться.)

(* Деление на 2 *)

S = {} ; (* Пустое мультимножество *) m = n;

While (2 | m)

Begin m = m/2; S = S {2} end; (* Основной цикл деления *)

d = 3; While(d2 m)

begin While (d | m) begin m = m/d; S = S {d} end; d = d + 2

end;

If (m == 1) then return(S) else return(S {m})

21

В общем случае, метод пробных делений, не эффективен. Но если число n имеет небольшой делитель, то алгоритм 3.1 достаточно быстро установит, что n – составное число.

Функция trialDivision – реализация этого алгоритма в

Mathematica.

trialDivision[n_] := Module[{s = {}, m = n, d},

While[Divisible[m, 2], m = m/2; AppendTo[s, 2]]; d = 3;

While[d^2 m,

While[Divisible[m, d], m = m/d; AppendTo[s, d]]; d = d + 2];

If[m == 1, s, AppendTo[s, m]]]

22

§ 4. Метод Ферма разложения на множители

Рассмотрим ситуацию, когда нечетное составное число n равно произведению приблизительно равных сомножителей a и b.

Метод Ферма достаточно быстро находит a и b. Точнее, такие a и b, что n = ab и разность

a +b

n

2

 

 

– наименьшая из возможных.

Если n – простое, то единственно возможные значения для a

и b – это a = n, b = 1.

Очевидно, a и b должны быть нечетными числами и

поэтому можно определить целые x = (a + b)/2 и y = (a b)/2. В этом случае n = x2 y2 = (x + y)(x y), и,

следовательно, x2 n является точным квадратом. Поиск

квадрата такого вида начинается с x = n –наименьшего числа, при котором разность x2 n неотрицательна.

23

Алгоритм 4.1. (алгоритм Ферма разложения на множители). Дано нечетное натуральное число n > 1. Алгоритм выдает нетривиальное разложение числа n или сообщает о том, что n – простое число.

x = n ;

While ( x2 n – не целое число) do x = x+1;

y = x2 n ; (* y – целое *)

If x+y == n then return("простое число")

else return({x + y,x – y})

Почему этот алгоритм заканчивается? Потому что в случае простого n число x достигает значения (n + 1)/2, для

которого число x2 n целое.

24

Функция partFactorFermat реализует алгоритм 4.1 в Mathematica.

partFactorFermat n_ :=

 

 

, x

 

x

1 ; y

 

 

 

;

 

WhileB:Not

f

v

>

 

 

 

 

 

 

 

Module

x =

B

n@ , Dy ,

 

FF

 

 

 

F

 

 

 

 

 

If=

+B

 

 

 

 

B

x^2 n

 

=

+

=

x^2 n

 

 

x @x

1

 

 

IntegerQ

 

 

 

 

 

 

<DD

 

n, Return

@

 

 

 

 

D

 

 

@8

x + y, x y

x

+ y

F

 

 

"простое число" , Return

 

;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

25

Метод пробных делений и алгоритм Ферма, используемые по отдельности, не эффективны. Но, комбинируя их, мы можем сделать большее.

Например, рассмотрим число 13506273942517991. Пробные деления не могут разложить это число на простые множители за разумное время. Но алгоритм Ферма выдает два сомножителя.

partFactorFermat[13506273942517991]

{116216501, 116216491}

Но с этими сомножителями алгоритм Ферма не может справиться, а метод пробных делений сразу выясняет, что они простые числа.

trialDivision[116216491]

{116216491}

trialDivision[116216501]

{116216501}

26

§ 5. Mathematica: функции с простыми числами

Рассмотрим основные функции Mathematica, связанные с простыми числами. Функция PrimeQ[n] является тестом на простоту целого числа n. Функцию можно применять сразу к списку целых чисел:

PrimeQ[Range[-7, 7]]

{True, False, True, False, True, True, False, False, False, True, True, False, True, False, True}

Функция Prime выдает простое число по заданному порядковому номеру:

{Prime[1], Prime[1000 000 000 000]}

{2, 29 996 224 275 833}

27

Для функции π(x), вычисляющей количество простых чисел, не превосходящих x, используется функция PrimePi. Функция PrimePi является обратной к функции Prime.

PrimePi[29 996 224 275 833]

1000 000 000 000

Функция π(x) аппроксимируется тремя функциями: отношением x/ln(x), интегральным логарифмом

x

R(x) = n=1 m(x)li(x1 n)/n,

li( x) =

1

dt и функцией Римана

lnt

0

 

 

 

где µ обозначает функцию Мебиуса1. Предел в бесконечности отношения каждой из этих функций к π(x) равен 1, но аппроксимация становится все более точной, если перечислять эти функции в следующем порядке: x/ln x, li(x), R(x).

1 Если m – произведение четного количества различных простых чисел, то m(m) = 1; если m – произведение нечетного количества различных простых чисел, то m(m) = –1 и, наконец, если m имеет кратный простой делитель, то m(m) = 0.

28

Графики функций на рисунке располагаются в порядке li(x),

R(x), x/ln x; ступенчатая функция – это π(x).

Plot[{LogIntegral[n], RiemаnnR[n], PrimePi[n], n /

Log[n], {n, 1.5, 100}]

 

 

 

30

 

 

 

 

25

 

 

 

 

20

 

 

 

 

15

 

 

 

 

10

 

 

 

 

5

 

 

 

 

0

40

60

80

100

20

29

Функция NextPrime выдает следующее простое число, или предыдущее:

{NextPrime[1000, –1], NextPrime[1000]}

{997, 1009}

Мы можем использовать функцию NextPrime, чтобы найти пары простых чисел – близнецов:

{#, # + 2}& /@ Select[Range[1000], PrimeQ[#] && NextPrime[#] == 2 + #&]

{{3, 5}, {5, 7}, {11, 13}, {17, 19}, {29, 31}, {41, 43}, {59, 61}, {71, 73}, {101, 103}, {107, 109}, {137, 139}, {149, 151}, {179, 181}, {191, 193}, {197, 199}, {227, 229}, {239, 241}, {269, 271}, {281, 283}, {311, 313}, {347, 349}, {419, 421}, {431, 433}, {461, 463}, {521, 523}, {569, 571}, {599, 601}, {617, 619}, {641, 643}, {659, 661}, {809, 811}, {821, 823}, {827, 829}, {857, 859}, {881, 883}}

30

Соседние файлы в папке Mathematica