Десять підказок для початківців GAP
-
Пам’ятайте, що GAP чутливий до регістру! Це означає, що
ABC
,Abc
іabc
є трьома різними ідентифікаторами. ВикликSymmetricGroup(3)
працює, алеSymmetricgroup(3)
призведе до помилки. -
Повідомлення про помилку
“Error, Variable: 'FuncName' must have a value”
під час виклику функції зазвичай вказує на друкарську помилку в назві функції (див. попередню підказку) або на якийсь пакет, який потрібно завантажити заздалегідь за допомогоюLoadPackage
. -
Не соромтеся використовувати довші та більш інформативні назви змінних, де це доцільно. Наприклад,
x
виглядає ідеально придатним дляList([1..10], x -> x^2)
, тоді якConClassesReps
може бути більш інформативним, ніж простоx
для списку представників класів спряженості групи (англ. “Conjugacy Classes Representatives”). -
Використовуйте редагування командного рядка: прокручуйте історію команд і переміщайтеся в командному рядку за допомогою клавіш зі стрілками, щоб редагувати його.
-
Використовуйте автозаповнення замість того, щоб вводити назви функцій і змінних повністю. Введіть початкову частину ідентифікатора, а потім натисніть
<Tab>
. Він буде доповнений, якщо можливе його унікальне завершення. Якщо ні, ви можете знову натиснути<Tab>
щоб переглянути всі можливі пропозиції. -
Щоб переглянути сторінки довідки, використовуйте команди
?
і??
. Це дозволить шукати не тільки у посібниках GAP, але також у посібниках усіх пакетів GAP, доступних у вашій інсталяції GAP. -
Встановіть HTML у якості формату довідки за замовчуванням. Використовуйте
SetHelpViewer
, щоб переглянути його у бажаному браузері. -
Використовуйте **
LogTo
** щоб зберегти всі введення та виведення GAP у текстовий файл. Його слід викликати перед обчисленнями, а не після! -
Якщо обчислення триває надто довго, натисніть
<Control>-C
, щоб перервати його. Потім введіть quit; щоб вийти з перерваного циклу. -
Прочитайте Перша сесія з GAP з Підручнику з GAP.
Написання програм на GAP
-
Використовуйте прямі обчислення в командному рядку для дослідження об’єктів і прототипування, а потім подумайте, як упорядкувати свій код, щоб зробити його багаторазовим.
-
Використовуйте
LogTo
для збереження вхідних і вихідних даних у файл журналу, який потім можна редагувати в текстовому редакторі. -
Збережіть код у текстових файлах і використовуйте
Прочитайте
, щоб завантажити їх. Знайдіть розширений текстовий редактор для редагування цих файлів. -
Зробіть свій код модульним і придатним для багаторазового використання, організувавши функціями.
-
Пишіть коментарі в коді – це допоможе вам, коли ви повернетеся до нього через деякий час.
-
Зрозумійте, розрив циклів: що ви можете досліджувати змінні на поточному рівні перерви та використовувати,
Where
щоб показати останні команди до того, як сталася помилка. -
Використовуйте механізм переваг для налаштування GAP, наприклад, щоб установити засіб перегляду довідки на HTML або зробити історію командного рядка доступною після виходу з GAP під час наступного сеансу GAP.
-
Зрозумійте теорію, що лежить в основі обчислень: теоретичні вдосконалення можуть підвищити продуктивність набагато більше, ніж високооптимізований код, який все ще виконує обчислення грубою силою.
-
Реалізуючи алгоритми, не забувайте про наріжні випадки. Наприклад, чи працює реалізація на тривіальній групі чи одиничному елементі?
-
Не покладайтеся на те, що функції GAP повертають результати в певному порядку, якщо це не задукоментовано. Наприклад, залежно від методу, це може бути не гарантованим, що класи спряженості або незвідні символи перераховані в певному порядку, або що перший елемент у їх списку є класом спряженості одиничного елемента або тривіального символу.
-
Не вимагайте більше, ніж вам потрібно, оскільки це може вплинути на продуктивність. Наприклад:
-
Якщо властивість є інваріантом класу спряженості (елементів або підгруп), вам може бути цікаво лише поглянути на представників класів спряженості.
-
Якщо вас цікавить список елементів колекції без певного порядку, використовуйте
AsList
замістьAsSSortedList
. -
Не обчислюйте класи спряженості всіх підгруп, якщо напр. Вас цікавлять лише нормальні або максимальні підгрупи - для їх обчислення існують спеціальні методи.
-
Якщо ви шукаєте p-підгрупи, спочатку ви можете обчислити силовську p-підгрупу групи, а потім поглянути на її підгрупи та їх спряжені.
-
Представлення має значення: можливо, варто перетворити групу з fp групи на ізоморфну pc групу або групу перестановок, щоб використовувати швидші методи.
-
-
Перегляньте GAP Frequently Asked Questions, щоб отримати додаткові підказки.
Залишайтеся на зв’язку
-
Підпишіться на GAP Forum.
-
Якщо ви є на Twitter, підписуйтесь gap_system.
-
Якщо вам потрібна допомога, виберіть один із цих трьох варіантів, залежно від питання:
-
задати запитання в GAP Forum
-
надішліть їх до GAP Support
-
опублікуйте їх на Mathematics Q&A site
-
Внесок у GAP
-
Якщо ви вважаєте, що знайшли помилку: будь ласка, створити проблему на GitHub або повідомте про це електронною поштою на адресу GAP Support.
-
Будь ласка, вкажіть GAP, якщо Ви його використовуєте. Це сприяє зростанню спільноти, і це допоможе вам у відповідь. Ця сторінка підказує, як цитувати GAP і функція
Цитувати
допоможе створити зразок цитування для тієї самої версії GAP, яка використовується. -
Подумайте про те, щоб поділитися своїми розробками GAP з іншими, від спільного використання вашого коду доступними засобами до організації його в пакет GAP, надісланий для повторного розповсюдження через GAP і, за бажанням, для рецензування.
-
Сприяти подальшому розвитку самого уроку.
Поради та підказки
- Це простий підхід для виклику GAP зі сценарію оболонки. Створіть сценарій
оболонки під назвою
check-one-order.sh
із таким вмістом:
#!/bin/sh
gap -r -b -q avgord.g << EOI
TestOneOrderEasy( $1 );
quit;
EOI
і зробіть його виконуваним за допомогою chmod u+x check-one-order.sh
. Тепер ви можете назвати
це так:
$ ./check-one-order.sh 24
fail
$ ./check-one-order.sh 105
[ 105, 1 ]
- Читання файлів із даними
GAP може читати будь-який дійсний ввід GAP із коду за допомогою Read
. Вміст буде
прочитано та оцінено в основному циклі читання-оцінки-друку, але результати
не будуть надруковані. Іноді вам може знадобитися прочитати вміст файлу як функцію
та повернути цю функцію - для цієї мети вам може знадобитися ReadAsFunction
.
Але що робити, якщо у вас є файл даних, що надходить з іншого джерела, і це
недійсний ввід GAP? Іноді ви можете керувати інструментом, який експортує
дані, і можете налаштувати його для створення вхідного файлу GAP. Але де шукати,
якщо цей варіант неможливий?
ReadCSV( filename[, nohead][, separator] )
читає файл у форматі CSV (значення,
розділені комами) і повертає його записи як список записів
(див. here).
Записи першого рядка файлу будуть використані для імен
компонентів запису (прогалини будуть перетворені на підкреслення).
Можна також вказати, що перший рядок містить дані замість імен полів, а також
вказати спеціальний роздільник. Навпаки, PrintCSV
може використовуватися для виведення файлів CSV.
Щоб читати довільні (бінарні або текстові) файли як рядки, скористайтеся функцією StringFile
,
що надається пакетом GAPDoc (see
тут).
Він поверне вміст файлу у вигляді рядка.
Після цього ви можете використовувати різні інструменти для роботи з рядками (див.
Рядки та символи
у довідковому посібнику GAP) , щоб обробити його потрібним вам способом. Пакет GAPDoc
також надає функцію FileString
, яка записує вміст рядка
у файл.
Якщо вам потрібно організувати читання/запис рядок за рядком, замість читання
або запису всього файлу/рядка одночасно, ми пропонуємо переглянути функціональні
можливості, які надає пакет IO
(див. тут),
зокрема, в IO_ReadLine
і IO_WriteLine
.