Примітки для викладача

Загальні зауваження


  • Для першого уроку добре мати доступ до Windows (віртуальної машини чи через віддалений доступ), щоб продемонструвати деякі специфічні для Windows аспекти роботи з GAP.

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

  • Важливо, щоб слухачі зрозуміли, як працювати з файлами, розташованими в різних каталогах. ChangeDirectoryCurrent — це функція з пакета IO, який вимагає компіляції та має бути доступним, якщо GAP встановлено належним чином (тобто згідно з інструкціями для семінару). У разі будь-яких проблем першим кроком усунення несправностей є перевірка того, що LoadPackage("io"); не повертає fail. Якщо так, то розв’язанням проблеми для користувачів Windows є введення повних шляхів до файлів. Користувачам Linux та macOS знайти вихід легше, тому що вони можуть спочатку перейти до потрібного каталогу у терміналі, а потім запустити GAP звідти.

  • Допоможіть налаштувати параметри терміналу, особливо покажіть користувачам Windows, що вони можуть налаштувати кольори та шрифти, які використовує термінал.

  • Поясніть, як копіювати та вставляти ввід та вивід (особливо у Windows).

  • Поясніть, як читати матеріал уроку: текст, який треба вводити у GAP зображується без запрошення GAP. Вивід GAP має синій колір. Помилки відображаються червоним кольором. Запрошення GAP не показані, окрім випадків, коли це справді необхідно (наприклад, щоб продемонструвати, як працює багаторядковий ввід).

  • Важливо, щоб інструктор запускав GAP з опцією -r, щоб уникнути використання власних налаштувань GAP, наприклад, локально встановлених пакетів та іншого вмісту каталогу .gap.

  • Щоб використовувати кольорове запрошення, коли GAP запускається з опцією -r та ігнорує всі локальні налаштування, включаючи це (якщо встановлено), викличте ColorPrompt(true);.

Перша сесія з GAP


  • Підкресліть, що банер містить інформацію про версію GAP. Ці дані корисні для цитування GAP або повідомлення про помилки. Вибір пакетів може відрізнятися, але відсутність пакетів IO та Browse означає, що ці та, можливо, деякі інші пакети, які потребують компіляції, не були скомпільовані.

  • Другий виклик LogTo("logfile"); не відкриє новий файл, але повідомить, що GAP вже записує цю сесію до іншого файлу. У цьому випадку або проігноруйте його, якщо ви хочете продовжити ведення журналу, який уже використовується, або викличте LogTo();, щоб закрити поточний файл журналу, а потім викличте LogTo з аргументом, щоб почати запис в новому файлі.

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

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

  • Майте на увазі, що екран вибору розділів довідки виглядатиме інакше, якщо пакет Browse не скомпільовано.

  • Поясніть, як перейти до перегляду HTML-версії документації GAP з підтримкою MathJax.

  • Зверніть увагу на різницю між AsList і AsSSortedList.

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

  • При демонстрації введення Sum( List( elts, Order ) ) / Length( elts ); покажіть, як зібрати цю команду за допомогою редагування командного рядка та переміщення по рядку, можливо, виконавши часткову команду, щоб побачити її результат, замість того, щоб вводити всю команду послідовно від першого до останнього символу.

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

  1. Розв’язання задачі: Filtered( elts, g -> 2^g = 2 ); та Filtered( elts, g -> (1,2)^g = (1,2) );.

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


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

  • Підкресліть, що організація складних об’єктів у вкладені записи може бути більш ефективною, ніж вкладені списки.

  • Майте на увазі, що w:="supercalifragilisticexpialidocious"; IsSubset(w,'s'); призводить до помилки “метод не знайдено”. Це може бути вдалим моментом для представлення цього особливого виду повідомлень про помилки.

  • Щодо розширення GAP за допомогою нових типів об’єктів, дивіться розділи Створення нових об’єктів та Приклади розширення системи з довідкового посібника GAP. Також пакет Circle надає приклад розширення GAP новими мультиплікативними об’єктами.

  1. Розв’язання задачі: r:=c[1]; for i in [2..Length(c)] do if c[i][2]>r[2] then r:=c[i]; fi; od; r;

Функції в GAP


  • Приділіть деякий час структурі функції GAP: ключові слова function, local, return, end та інші мовні конструкції, представлені там.

  • Розкажіть, як досліджувати проблему, показуючи приклад повідомлення про помилку та запрошення brk>.

Використання регресійних тестів


  • Слухачам може знадобитися допомога з форматуванням тесту через неправильне розташування коментарів та/або інше форматування вихідних даних.

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

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

  • Згадайте функцію TestDirectory для виконання набору тестів.

  • Пригадайте інструменти профілювання та покриття коду.

Пошук груп малих порядків


  • Оглядово розкажіть про SmallGroup, AllSmallGroups, NrSmallGroups та SmallGroupsInformation та наведіть деякі приклади.

  • Обговоріть, чому перебір кращий, ніж AllSmallGroups, що може виснажити пам’ять (згадайте концепцію об’єктів, що самонавчаються).

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

  • Програмування на льоту (live coding) є кращим способом викладання того, як створити більшість функцій з цього уроку.

  1. Розв’язання задачі: Sum(List(Filtered([1..2000], n -> not IsPrimePowerInt(n)),NrSmallGroups)); NrSmallGroups(1536); last2-last;. Крім SmallGroup(105,1) та SmallGroup(357,1), іншою групою є SmallGroup(1785,1).

Атрибути та методи


  • Чому не варто оголошувати Random як атрибут?
  1. Ідеї для завдання: спробуйте k:=1, а потім k:=k+1;n:=2^k;AvgOrdOfCollection(DihedralGroup(n));time;AvgOrdOfGroup(DihedralGroup(n));time;. Навіть для k=20 перша функція займає приблизно 15 секунд, а друга – приблизно 115 секунд на MacBook Pro.