Вернуться к списку примеров


Числовые системы в GAP

Для начала покажем, как в системе задаются целые и рациональные числа. Задание целых чисел производится очевидным образом:

gap> 123456789; # результат ввода отображается на экране
123456789
gap> a:=123456789; # присвоим это же значение переменной a
123456789
gap> a; # теперь посмотрим значение переменной a
123456789

Рациональные числа представляются в виде несократимых дробей. Если ввести рациональное число, которое является сократимой дробью, оно будет преобразовано в несократимую:
gap> 12/19; # правильная дробь
12/19
gap> 54564/19; # неправильная дробь
54564/19
gap> 500/6000; # сократимая дробь
1/12
Над целыми и рациональными числами можно выполнять операции сложения, вычитания, умножения, деления, нахождения остатка от деления на заданное число, и возведения в степень:
gap> (15+12)*30/121;
810/121
gap> 154654 mod 13; # остаток от деления на 13
6
gap> 2^100; # возведение в 100-ю степень
1267650600228229401496703205376
gap> 2^1000; # вывод 2^1000 на экран занимает несколько строк
107150860718626732094842504906000181056140481170553360744375038837
035105112493612249319837881569585812759467291755314682518714528569
231404359845775746985748039345677748242309854210746050623711418779
541821530464749835819412673987675591655439460770629145711964776865
42167660429831652624386837205668069376
При этом важно учитывать приоритет выполнения этих операций. Например, 154654-6 mod 13 возвращает 154648, а (154654-6) mod 13 возвращает 0, поскольку первый вариант будет интерпретирован как 154654-(6 mod 13).

В системе GAP нет ограничений на абсолютную величину целых и рациональных чисел, с которыми может работать система – она ограничена только объемом доступной памяти. Например, найдем количество цифр в десятичной записи числа 2^15935:
gap> a:=2^15935;;
gap> Length(String(a));
4797
Таким образом, в записи этого числа 4797 цифр!!! Это максимальная степень числа 2, которая будет отображаться на экране (для этого потребуется более 50 строк при ширине экрана 80 символов)! Но оперировать мы можем и с гораздо большими числами, даже не видя при этом их отображения на экране. Например, найдем остатки от деления 2^20000 на 11 и 12:
gap> b:=2^20000;
<<an integer too large to be printed>>
gap> b mod 11;
1
gap> b mod 12;
4
Следует заметить, что идеология работы с числовыми системами в GAP отличается от той, которая является привычной для пользователя, например, языков программирования Pascal или Fortran. Во-первых, в системе GAP нет приближенных вычислений с действительными числами. Вместо этого в ней есть точные вычисления с рациональными числами, которые представляются несократимыми дробями. Во-вторых, целые и рациональные числа задаются соответственно командами Integers и Rationals, но это не описание типа переменной, как в некоторых языках программирования, а задание алгебраических структур:
gap> I:=Integers;
Integers
gap> Q:=Rationals;
Rationals
С этими структурами можно выполнять ряд различных действий. Например, проверить, является ли заданное число целым и рациональным (это же можно сделать и с помошью функций IsInt и IsRat):
gap> 12/20 in I;
false
gap> IsInt(12/20);
false
gap> 15156 in Integers; #
true
gap> 125 in Rationals; #
true
gap> 125/13 in Q; #
true
gap> IsRat(125/13);
true
Далее, можно проверить ряд алгебраических свойств систем целых и рациональных чисел, например:
gap> IsFinite(Integers); # конечность
false
gap> IsCommutative(Integers); # коммутативность по умножению
true
gap> IsAdditivelyCommutative(Integers); # коммутативность по сложению
true
gap> Units(Integers); # обратимые элементы относительно умножения
[-1, 1]
gap> Zero(Integers); # нулевой элемент относительно сложения
0
gap> IsField(Rationals); # образуют ли рациональные числа поле
true
gap> MultiplicativeNeutralElement(Rationals); # нейтральный элемент
                                              # относительно умножения

1

Аналогичным образом можно задавать множества положительных и неотрицательных целых чисел с помощью функций PositiveIntegers и NonnegativeIntegers.

В свою очередь, функции GaussianIntegers и GaussianRationals задают соответственно подкольцо Z [i] поля комплексных чисел, и поле Q(i), где i2 = -1, и в GAP задается как E(4):
gap> L:=GaussianIntegers;
GaussianIntegers
gap> x:=Random(L); # выберем случайным образом элемент из L
1-4*E(4)
gap> y:=10+2/5*E(4); # второй элемент зададим вручную
10+2/5*E(4)
gap> x*y; # найдем их произведение
58/5-198/5*E(4)
gap> x*y in L; # оно не является целым Гауссовым числом
false
gap> x*y in GaussianRationals; # зато является рациональным Гауссовым числом
true



Вернуться к списку примеров