Ще декілька типів об’єктів GAP

Останнє оновлення 2026-05-06 | Редагувати цю сторінку

Огляд

Питання

  • Подальші приклади об’єктів і операцій з ними

Цілі

  • Ознайомитися із деякими типами обʼєктів, які є в GAP, але можуть бути відсутні в інших системах
  • Розглянути більше прикладів роботи зі списками

Наразі ми познайомилися з трьома типами обʼєктів у GAP:

  • простими об’єктами (наприклад, цілі числа, раціональні числа, булеві значення, перестановки тощо);

  • складеними об’єктами (наприклад списки);

  • об’єктами з більш складними внутрішніми представленнями (наприклад, групи).

У цьому розділі ми продемонструємо деякі інші приклади базових об’єктів, які існують у GAP. Більш того, у GAP можна самостійно вводити нові типи об’єктів, але це виходить за рамки цього уроку.

Ще декілька типів простих об’єктів у GAP - це числа з плаваючою комою, циклотомічні числа та елементи скінченних полів:

GAP

1.15; Float(1232/3456567);

ВИХІД

1.15
0.000356423

GAP

E(4); E(4)^2; E(6);

ВИХІД

E(4)
-1
-E(3)^2

GAP

AsList(GF(2)); Z(5); Z(5)^4;

ВИХІД

[ 0*Z(2), Z(2)^0 ]
Z(5)
Z(5)^0

Ви вже знаєте про списки. Іншим типом складених об’єктів є записи. У той час як список містить підоб’єкти, проіндексовані за їх позиціями в списку, запис містить підоб’єкти, які називаються компонентами запису та індексуються за своїми іменами. Елементи запису доступні за допомогою символу . (крапка).

GAP

date:= rec(year:= 2015, month:= "Nov", day:= 17);

ВИХІД

rec( day := 17, month := "Nov", year := 2015 )

GAP

date.year;

ВИХІД

2015

GAP

date.time:= rec(hour:= 14, minute:= 55, second:= 12);

ВИХІД

rec( hour := 14, minute := 55, second := 12 )

GAP

date;

ВИХІД

rec( day := 17, month := "Nov",
  time := rec( hour := 14, minute := 55, second := 12 ), year := 2015 )

GAP

RecNames(date);

ВИХІД

[ "time", "year", "month", "day" ]

Далі, GAP має рядки та символи. Хоча GAP друкує рядки спеціальним чином, насправді рядок — це лише список символів, і будь-яка функція, яка приймає список, також прийматиме рядок. Навпаки, символи є такими ж простими об’єктами, як, наприклад, цілі числа.

GAP

gap> w:="supercalifragilisticexpialidocious"; Length(w);

ВИХІД

"supercalifragilisticexpialidocious"
34

Рядки позначаються подвійними лапками, а символи одинарними.

GAP

gap> "s" in w; 's' in w; IsSubset(w,"s");  IsSubset(w,['s','f']); ['c','a','t'] = "cat";

ВИХІД

false
true
true
true
true

Зауважте, що

GAP

gap> PositionSublist(w,"sf"); PositionSublist(w,"fr");

ВИХІД

fail
10

Будьте обережні! Деякі операції можуть створити новий список, тоді як інші є деструктивними. Наприклад:

GAP

gap> SortedList(w); w;

ВИХІД

"aaacccdeefgiiiiiiillloopprrssstuux"
"supercalifragilisticexpialidocious"

але

GAP

gap> Sort(w); w;

ВИХІД

"aaacccdeefgiiiiiiillloopprrssstuux"

Яка літера зустрічається у “supercalifragilisticexpialidocious” найчастіше?

GAP

gap> c := Collected(w);

ВИХІД

[ [ 'a', 3 ], [ 'c', 3 ], [ 'd', 1 ], [ 'e', 2 ], [ 'f', 1 ], [ 'g', 1 ],
  [ 'i', 7 ], [ 'l', 3 ], [ 'o', 2 ], [ 'p', 2 ], [ 'r', 2 ], [ 's', 3 ],
  [ 't', 1 ], [ 'u', 2 ], [ 'x', 1 ] ]

GAP

gap> k := Maximum( List( c, v -> v[2] ) ); Filtered( c, v -> v[2] = 7 );

ВИХІД

7
[ [ 'i', 7 ] ]
Обговорення

Пошук букв, які найчастіше зустрічаються у списку, за допомогою лише одного повного перебору

Команда

k := Maximum( List( c, v -> v[2] ) ); Filtered( c, v -> v[2] = 7 );

двічі перебирає список c (спочатку у List, а потім у Filtered), а також перебирає інший список такої ж довжини, що й список c під час виклику Maximum. Якщо список довгий, це може зайняти більше часу та потребує більше пам’яті. Спробуйте написати код, який знаходить літери, які найчастіше зустрічаються в рядку c, не створюючи проміжного списку.

Ключові моменти
  • GAP має різноманітні прості та складені об’єкти.
  • GAP має дуже гнучкий та потужний інструментарій для роботи зі списками.
  • Такі об’єкти, як списки та записи, добре підходять для зберігання структурованих і пов’язаних даних.