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

Огляд

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

Цілі
  • Перегляньте приклади типів, які вбудовані в GAP, але можуть бути відсутні в інших системах

  • Подивіться приклади арифметики списку

Наразі ми познайомилися з трьома типами GAP:

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

Деякі інші прості об’єкти - це floats, cyclotomics and finite field elements:

1.15; Float(1232/3456567);
1.15
0.000356423
E(4); E(4)^2; E(6);
E(4)
-1
-E(3)^2
AsList(GF(2)); Z(5); Z(5)^4;
[ 0*Z(2), Z(2)^0 ]
Z(5)
Z(5)^0

Ви вже знаєте про списки. Іншим типом складених об’єктів є записи. У той час як список містить субоб’єкти, проіндексовані за їх позиціями в списку, запис містить субоб’єкти, які називаються компонентами запису, які індексуються за своїми іменами. Elements of a record are accessed with .

date:= rec(year:= 2015, month:= "Nov", day:= 17);
rec( day := 17, month := "Nov", year := 2015 )
date.year;
2015
date.time:= rec(hour:= 14, minute:= 55, second:= 12);
rec( hour := 14, minute := 55, second := 12 )
date;
rec( day := 17, month := "Nov",
  time := rec( hour := 14, minute := 55, second := 12 ), year := 2015 )
RecNames(date);
[ "time", "year", "month", "day" ]

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

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

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

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

Зауважте, що

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

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

gap> SortedList(w); w;
"aaacccdeefgiiiiiiillloopprrssstuux"
"supercalifragilisticexpialidocious"

але

gap> Sort(w); w;
"aaacccdeefgiiiiiiillloopprrssstuux"

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

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> 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 );

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

Ключові моменти

  • GAP має безліч різноманітних безпосередніх, позиційних і складових об’єктів.

  • Арифметика списків є дуже гнучкою та потужною.

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