Обговорення

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

Десять порад для початківців GAP


  1. Пам’ятайте, що GAP чутливий до регістру! Це означає, що ABC, Abc та abc є трьома різними ідентифікаторами. Виклик функції SymmetricGroup(3) працює, але Symmetricgroup(3) призведе до помилки.

  2. Повідомлення про помилку “Error, Variable: 'FuncName' must have a value” під час виклику функції зазвичай вказує на друкарську помилку в назві функції (див. попередню пораду) або на якийсь пакет, який потрібно завантажити заздалегідь за допомогою LoadPackage.

  3. Не вагайтеся використовувати довші та більш інформативні назви змінних, де це доцільно. Наприклад, x виглядає ідеально придатним для List([1..10], x -> x^2), а ConClassesReps може бути більш інформативним, ніж просто x для списку представників класів спряженості елементів групи (від англ. “Conjugacy Classes Representatives”).

  4. Використовуйте редагування командного рядка: переглядайте історію команд та переміщайтеся в командному рядку за допомогою клавіш зі стрілками, щоб редагувати рядок.

  5. Використовуйте автодоповнення замість того, щоб вводити назви функцій і змінних повністю. Введіть початкову частину ідентифікатора, а потім натисніть <Tab>. Він буде доповнений, якщо можливе його унікальне закінчення. Якщо ні, знову натисніть <Tab>, щоб переглянути всі можливі пропозиції.

  6. Щоб переглянути сторінки довідки, використовуйте команди ? і ??. Це дозволить шукати не тільки у документації самої системи GAP, але також у документації усіх пакетів, доступних у вашій інсталяції GAP.

  7. Встановіть HTML у якості формату довідки за замовчуванням. Використовуйте SetHelpViewer для перегляду у бажаному браузері.

  8. Використовуйте LogTo, щоб зберегти всі введення та виведення GAP у текстовий файл. Цю функцію слід викликати перед обчисленнями, а не після!

  9. Якщо обчислення триває надто довго, натисніть <Control>-C, щоб перервати його. Потім введіть quit; щоб повернутись до головної сесії GAP.

  10. Прочитайте розділ “A First Session with GAP”, який міститься у GAP Tutorial.

Програмування у GAP


  • Використовуйте прямі обчислення в командному рядку для дослідження об’єктів і прототипування, а потім подумайте, як упорядкувати свій код для використання у майбутньому.

  • Використовуйте LogTo для збереження вводу та виводу у файл журналу, який потім можна редагувати в текстовому редакторі.

  • Зберігайте код у текстових файлах і використовуйте Read для їх завантаження. Оберіть якийсь повнофункціональний текстовий редактор для редагування цих файлів.

  • Шляхом створення функцій робіть свій код модульним і придатним для багаторазового використання.

  • Пишіть коментарі у коді – це допоможе, коли ви повернетеся до нього через деякий час.

  • Зрозумійте, що робити, коли GAP видає запрошення brk>: ви можете дослідити змінні у поточному контексті виконання та використати Where, щоб побачити останні команди до того, як сталася помилка.

  • Використовуйте механізм налаштувань для налаштування GAP, наприклад, щоб установити перегляд довідки у форматі HTML або зробити історію командного рядка доступною після виходу з GAP під час наступного сеансу GAP.

  • Зрозумійте теорію, на якій базуються обчислення: теоретичні вдосконалення можуть підвищити продуктивність коду набагато більше, ніж оптимізований код, який все ще виконує обчислення “грубою силою”.

  • Під час розробки алгоритмів, не забувайте про виключні випадки. Наприклад, чи працює ваш код з тривіальною групою чи одиничним елементом?

  • Не покладайтеся на те, що функції GAP повертають результати в певному порядку, якщо це незадокументовано. Наприклад, деякі методи не гарантують, що класи спряженості або незвідні характери перераховані в певному порядку. Більш того, перший елемент у їх списку не обовʼязково є класом спряженості одиничного елемента або тривіальним характером.

  • Не намагайтеся обчислити більше інформації, ніж вам потрібно, оскільки це може вплинути на продуктивність. Наприклад:

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

    • Якщо вас цікавить список елементів колекції у довільному порядку, використовуйте AsList замість AsSSortedList.

    • Не обчислюйте класи спряженості всіх підгруп, якщо, наприклад, треба знайти лише нормальні або максимальні підгрупи - для їх обчислення існують спеціальні методи.

    • Якщо шукаєте p-підгрупи, спочатку ви можете обчислити Силовську p-підгрупу групи, а потім отримати її підгрупи та спряжені з ними.

    • Представлення має значення: можливо, варто перетворити групу з fp-групи на ізоморфну pc-групу або групу перестановок, щоб використовувати швидші методи.

  • Перегляньте GAP Frequently Asked Questions, щоб знайти додаткові поради.

Залишайтеся на зв’язку


  • Підпишіться на GAP Forum.

  • Якщо вам потрібна допомога, виберіть один із цих трьох варіантів, залежно від питання:

Внесок у GAP


  • Якщо ви вважаєте, що знайшли помилку: будь ласка, опишіть проблему на GitHub або повідомте про це електронною поштою на адресу GAP Support.

  • Будь ласка, цитуйте GAP, якщо ви його використовуєте. Це сприяє зростанню спільноти, що має позитивний вплив на її учасників. Ця сторінка рекомендує, як цитувати GAP. Також, функція Cite створює зразок цитування для тієї самої версії GAP, яка використовується.

  • Розгляньте можливість поділитися своїми розробками у GAP з іншими, від поширення вашого коду доступними засобами до організації його в пакет GAP, який можна запропонувати для розповсюдження разом з GAP у складі його дистрибутива.

  • Допоможіть подальшому розвитку цього уроку.

Поради та підказки


  • Це простий підхід для виклику GAP зі скрипту оболонки. Створіть скрипт оболонки під назвою check-one-order.sh з таким вмістом:

GAP

#!/bin/sh

gap -r -b -q avgord.g << EOI
TestOneOrderEasy( $1 );
quit;
EOI

та зробіть його виконуваним за допомогою chmod u+x check-one-order.sh. Тепер ви можете викликати цей скрипт:

GAP

$ ./check-one-order.sh 24

ВИВІД

fail

GAP

$ ./check-one-order.sh 105

ВИВІД

[ 105, 1 ]
  • Читання файлів із даними

GAP може читати будь-який дійсний ввід GAP із файлу за допомогою Read. Вміст буде прочитано та виконано в контексті головної сесії GAP, але результати не будуть надруковані. Іноді може знадобитися прочитати вміст файлу як функцію та повернути цю функцію. Для цієї мети можна використовувати ReadAsFunction. Але що робити, якщо треба прочитати деякі дані, що надійшли в іншому форматі з іншого джерела? Іноді ви можете контролювати формат експорту даних та налаштувати його для виводу вхідного файлу GAP. Якщо цей варіант неможливий, то що нам робити?

Функція ReadCSV( filename[, nohead][, separator] ) читає файл у форматі CSV (значення, розділені комами) і повертає його рядки як список записів (див. документацію). Зміст першого рядка файлу буде використано для імен компонентів записів (пробіли будуть замінені на підкреслення). Можна також вказати, що перший рядок теж містить дані замість імен полів, а також вказати спеціальний роздільник. Навпаки, функція PrintCSV може використовуватися для виведення файлів у CSV форматі.

Щоб читати довільні (бінарні або текстові) файли як рядки, користуйтеся функцією StringFile, що надається пакетом GAPDoc (див. документацію). Ця функція повертає вміст файлу у вигляді рядка. Після цього можна використовувати різні інструменти для роботи з рядками (див. “Strings and Characters” у довідковому посібнику GAP) для подальшої роботи з ним. Пакет GAPDoc також надає функцію FileString, яка записує вміст рядка у файл.

Якщо потрібно організувати читання/запис рядок за рядком, замість читання або запису всього файлу/рядка одночасно, розгляньте можливості, які надає пакет IO (див. документацію), зокрема, функції IO_ReadLine та IO_WriteLine.