Большинство функций Maple для исcледований в области теории чисел содержатся в модуле numtheory
.
Для его подключения необходимо дать команду with(numtheory):
.
Функция floor(x)
округляет число x
вниз, ceil(x)
округляет число вверх, функция
round(x)
округляет x
до ближайшего целого, функция trunc(x)
возвращает floor(x)
для положительных x
и -floor(-x)
– для отрицательных. Функция frac(x)
возвращает дробную часть числа x
.
Для нахождения частного при целочисленном делении используется функция iquo
, для вычисления остатка
от деления – функция irem
. У этих функций два параметра: делимое и делитель. Примеры:
> iquo(100,3);33> irem(100,1);
1
Также можно выполнять действия в кольце вычетов по заданному модулю. Для этого используется оператор
mod
у которого левый операнд – вычисляемое выражение, правый операнд – модуль, по которому
проводятся вычисления. Пример нахождения обратного элемента для числа 57 в кольце вычетов по модулю 179
и проверка правильности этого вычисления:
> 1/57 mod 179;22> irem(%*57,179);
1
Для нахождения наибольшего общего делителя двух чисел используется функция igcd
, для нахождения наименьшего общего кратного –
функция ilcm
. Пример:
> igcd(57,179);1
Расширенный алгоритм Евклида используется для нахождения по данным n и m таких чисел
u и v, что un+vm=d, где d – наибольший общий делитель m и n.
Для этого используется функция igcdex(n,m,'u','v')
, где m
, n
– исходные числа,
u
и v
– переменные, которым будут присвоено значение. Пример
> igcdex(57,179,'u','v');1> u; v;
22-7> 57*u+179*v;
1
Для проверки числа на простоту используется функция isprime
, которая возвращает true
,
если число простое и false
– если составное. Для разложения числа на множители используются функции
ifactor
и ifactors
. Первая функция возвращает результат в виде произведения степеней простых
чисел, вторая – в виде списка простых чисел и их степеней. Все эти функции работают значительно эффективней
простого подбора делителей, проверка на простоту осуществляется быстрее полного разложения на множители.
Для построения простых чисел используются функции prevprime
, nextprime
, ithprime
.
Функция prevprime(n)
возвращает наибольшее простое число, которое меньше n
,
функция nextprime(n)
возвращает наименьшее простое число, которое больше n
. Функция
ithprime(n)
возвращает n
-е простое число.
Для нахождения случайного простого числа следует использовать эти функции вместе с функцией rand()
,
которая возвращает псевдослучайное 12-значное натуральное число. Для инициализации генератора псевдослучайных чисел
необходимо использовать функцию randomize()
.
> isprime(7!);false> ifactor(7!);
(2)4(3)2(5)(7) ;> ifactors(7!);
[1, [[2, 4], [3, 2], [5, 1], [7, 1]]]> nexprime(7!);
5051> isprime(%);
true> nextprime(rand());
427419669163
Функция divisors(n)
возвращает список всех натуральных делителей данного целого числа.
Функия tau(n)
(тау-функция) возвращает количество делителей числа n
.
Функия sigma(n)
(сигма-функция) возвращает сумму делителей делителей числа n
.
Функция sigma[k](n)
возвращает сумму k
-х степеней делителей числа n
.
Функция pi(n)
(пи-функция) возвращает количество простых чисел,
не превосходящих n
.
Функция phi(n)
(фи-функция Эйлера) возвращает количество чисел,
меньших n
и взаимно простых с n
.
Для решения уравнений в целых числах используется функция isolve
. Примеры:
> isolve(5*x+7*y=1);x = -4-7_Z1, y = 3+5_Z1
В данном случае _Z1
обозначает произвольное целое число, поэтому общее решение имеет вид
x=-4-7n, y=3+5n.
Используем функцию isolve
для решения уравнения Пелля x2-2y2=1.
Вывод Maple мы будем часто опускать ввиду его объемности (повторите вычисления самостоятельно!).
> Sol:=isolve(x^2-2*y^2=1):
Мы получим 4 серии решений, отличающихся только знаками. Положительные решения имеют вид x=1/2*(3+2*sqrt(2))n+1/2*(3-2*sqrt(2))n, y = sqrt(2)/4*((3+2*sqrt(2))n-(3-2*sqrt(2))n). Положим n=0 и вычислим решение:
> _Z1:=0: Sol;{y = 0, x = 1}, {y = 0, x = -12}, {y = 0, x = -1}, {y = 0, x = 1}
Это – тривиальное решение. Минимальное нетривиальное решение будет при n=1.
> _Z1:=1: Sol;{x = 3, y = 2}, {y = 2, x = -3}, {x = -3, y = -2}, {x = 3, y = -2}
При n=2 решение, выдаваемое Maple будет содержать радикалы, поэтому придется использовать функцию expand
для раскрытия радикалов:
> _Z1:=2: expand(Sol);{x = 17, y = 12}
Для того, чтобы отменить присвоение _Z1
значения и снова сделать ее свободной переменной, необходимо использовать функцию unassign('_Z1')
.