Поздняков Сергей Николаевич
РЕКУРРЕНТНЫЕ ФОРМУЛЫ С ТОЧКИ ЗРЕНИЯ ИНФОРМАТИКИ И МАТЕМАТИКИ
ВВЕДЕНИЕ
Когда от вычислений на бумаге люди стали переходить к вычислениям на компьютере, многим пришлось решить для себя новую психологическую проблему. Кажется, что, вычисляя на бумаге, мы используем неограниченную «память тетради», то есть мы всегда можем заглянуть на одну или несколько страниц назад. Но, чтобы писать программу для компьютера, надо сразу ограничить используемую память, зафиксировав ее для начальных, промежуточных и выходных данных. Напомним, что в первых вычислительных машинах память по современным понятиям была вообще ничтожна.
К сожалению, большинство алгоритмов действительно требует для своего выполнения неограниченной памяти. Например, вычисление цифр числа «пи» требует работы с уже найденными цифрами. Однако есть алгоритмы, которым бесконечная память не нужна. Например, сложение двух сколь угодно длинных натуральных чисел можно вести поразрядно, используя память только для сохранения величины переноса из разряда в разряд, двух текущих складываемых цифр и двух цифр результата.
В настоящем занятии мы рассмотрим класс задач, которые обладают таким свойством: вычисляя последующие значения интересующей нас величины, мы пользуемся только фиксированным числом последних значений. Последовательности с таким свойством называют рекуррентными.
ЧИСЛА ФИБОНАЧЧИ
Самой известной рекуррентной последовательностью является последовательность чисел Фибоначчи, которая начинается с двух единичек, а каждое следующее
исляя оосх&рфощие ¿Лагешя иЛ&ересфощей Нас Религиям, мм «лл-й^^емся фиксирв&яЛНим гисллм тклефШх ¿ЛлгеШй...
значение равно сумме двух предыдущих: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...
Конечно, без неограниченной памяти здесь тоже не обойтись, ведь длины самих чисел растут неограниченно, зато для вычислений достаточно всего два таких числа, а это значит, что мы можем оптимизировать использование памяти, по сравнению с хранением всех первых чисел Фибоначчи.
Задание 1.
Попробуйте оценить, насколько удалось уменьшить загрузку памяти компьютера удалением всех вычисленных чисел Фибоначчи, кроме двух последних.
Лаисих гасла,,.
Уровень 1. В качестве оценки требуемой памяти возьмите сумму всех первых чисел Фибоначчи. Посчитайте суммы 2, 3, 4, 5, 6 первых чисел Фибоначчи. Можно ли эти суммы выразить через числа Фибоначчи? Проведите эксперимент. Сформулируйте гипотезу. Докажите ее по индукции.
Уровень 2. Возьмите теперь в качестве оценки требуемой памяти общее количество всех цифр в первых числах Фибоначчи. Напишите программу, которая по числу N первых чисел Фибоначчи выдает число цифр М в них. Например, если N =10, то М = 14.
Уровень 3. Проведите исследование связи этих двух оценок требуемой памяти. Есть ли между ними какая-нибудь связь? Попробуйте найти приближенную зависимость, относительная погрешность которой уменьшается при росте N Это означает, что, если 5 = f (М) - точная, а 5 = g(M) -приближенная зависимость, то значение (f (М) - g (М))// (М) становится сколь угодно малым при бесконечном увеличении N.
Рекуррентные последовательности задаются рекуррентными формулами или, как их еще называют, рекуррентными соотношениями или уравнениями. Например, последовательность чисел Фибоначчи задается такой формулой:
/П+1 /п "Л-р (1)
значения п берутся натуральными. Заметим, что в информатике счет обычно начинают с нуля, поэтому мы будем его тоже считать натуральным, однако, так как в формуле встречается индекс (номер числа Фибоначчи) п - 1, то подставлять в эту формулу можно только п =1,2, 3...
По этой формуле мы всегда найдем следующее число по двум предыдущим. Первые числа надо указать явно. Значения /0 и /1 называются начальными значениями нашего рекуррентного отношения.
Итак, равенства
/п+1= /п +/и /о=1, /1=1 (2)
полностью определяют последовательность чисел Фибоначчи.
Для рекуррентных соотношений представляет интерес нахождение их решений в
так называемой явной или замкнутой форме. Это означает, что при подстановке в такую формулу любого значения п для получения результата надо будет сделать фиксированное количество операций, то есть число операций не зависит от п. Сравните с вычислением п-го числа Фибоначчи по рекуррентной формуле с начальных значений. Чем больше значение п, тем больше операций потребуется, то есть замкнутой формой исходную рекуррентную формулу назвать нельзя.
Для тех, кто не знает замкнутой формулы для чисел Фибоначчи, ее нахождение будет настоящим математическим открытием. Здесь можно приостановить чтение и попробовать найти эту формулу. Предупреждаем сразу, что будет это нелегко.
Мы попробуем найти это решение в виде показательной функции: /п = Яп. Подставляя в основное уравнение (1), получим: ди+1 = 1п + 1п-1. Теперь сократим на Яп-1 и получим квадратное уравнение: Я2 = Я + 1 или Я2 - Я - 1=0. Это уравнение неожиданно имеет иррациональные корни:
Ях =
1 + у[5
и Я 2 =
1 -л/5
2 * 2 Почему неожиданно? Потому что наша последовательность состоит из натуральных чисел, а в последовательностях
1 + л/5
2
1 -75
2
целых чисел нет совсем!
Однако ситуация изменится, если эти последовательности сложить.
Решим вместе такую задачу.
Задача.
Написать программу, вычисляющую значения членов последовательности
. /Т í, 1Т\п
+
1+л/5
2
1 -л/5
2
Решение.
Первое, что приходит в голову, использовать операции возведения в степень, встроенные в любой язык программирования, и написать программу из одной строч-
п
п
ки, вычисляющую значения яп по введенному значению п.
Но тогда мы получим лишь приближенное значение sn и никогда не узнаем, целое ли оно на самом деле! Попробуем найти рекуррентную формулу для я. Для этого умножим sn на и попробуем выразить
i+45
i+45
2
-ч.И+1
i-45
i-45
2
\n+1
i+45
i-45
i-45
i+45
i+45
i+45 2
\n+i
i-45
i-45
\n+i
i+45
\n-1
■ (-1) +
i-45
\n-1
(-1)= ■■
Если заметить, что 5Х= 1, то получаем простую формулу:
= Яп+1 - Яп-1 или Яп+1 = + Яп-1 .
Подстановкой в исходную формулу вычислим значение я2, оно равно 3.
Видим, что все числа в последовательности целые. Последовательность 5п отличается от последовательности Фибоначчи, хотя определяется тем же рекуррентным соотношением.
Задание 2.
Уровень 1. Подберите такие А и В, чтобы получилась формула для чисел Фибоначчи
f = Aa + Bb ,
^ n n n'
где
1+ У5
2
v у
и bn =
1 -л/5
2
Задание 3.
Проведите исследование последовательности
nn
1 + V2
2
+
1 —s/2 2
Уровень 1. Выведите рекуррентную формулу для и. Докажите, что все ип рациональные числа, то есть задаются дробью
и, =
Чп
Уровень 2. Найдите рекуррентные соотношения для pn и q .
Напишите программу, вычисляющую значения p и q
n n
a) в пределах, допустимых типом integer;
b) описываемых массивами цифр от 1 до N.
Если на вход этой программы подается значение n, то на выходе должны быть в случае
a) числа pn и qn;
b) массивы с цифрами чисел pn и qn.
Замечание. Дробь ^^ не требуется
4n
делать несократимой.
n
1+ V 2
Уровень 3. Степень —-— пред-V у
An + Bn-л/2 Н й
ставляется в виде —----. Найдите
Cп
рекуррентные формулы для вычисления коэффициентов An, Bn, Cn.
ХАНОЙСКИЕ БАШНИ
Фабула новой задачи связана с легендой. При сотворении мира Всевышний, наряду с остальным, создал три алмазных шпиля. На один из них он водворил 64 диска из чистого золота: нижний самый большой, а каждый следующий меньше преды-
+
2
2
+
+
2
2
2
+
+
2
2
2
2
2
2
n
n
an =
Un =
А
&<олее простой ¿ариаНЛ с ¿осемш фисками...
дущего. И повелел Всевышний своим служителям переместить диски на соседний по таким правилам: перемещать надо по одному диску за раз и при перемещении нельзя класть больший диск на меньший, для чего и нужен третий стержень. Как только жрецы закончат свою работу, наступит конец света.
Более простой вариант с восемью дисками математик Эдуард Люка предложил использовать как головоломку.
Попробуем применить к исследованию задачи метод рекуррентных соотношений.
Обозначим Т - минимальное число
п
перемещений башни из п дисков с одного стержня на другой по описанным правилам.
Чтобы переместить самый большой диск, надо сначала убрать с него все диски меньшего размера. Переместим их на промежуточный стержень. Для этого нужно сделать Тп-1 перемещение. Затем положим большой диск на свое место - одно перемещение, а затем на него переместим всю башню из п - 1 дисков с промежуточного стержня. Для этого понадобится еще Тп-1 перемещение.
Таким образом, всего для перемещения башни из п дисков нужно сделать не менее 2Тп-1 + 1 перемещений. Поскольку нас интересует минимальное число перемещений, получаем рекуррентное соотношение: Т = 2Т , + 1.
п п-1
Начальное значение Т1 = 1 очевидно, так как башню из одного диска можно переместить за один ход.
Построим последовательно несколько значений Тп: 1, 3, 7, 15, 31, 63...
Тем, кто знаком с двоичной системой счисления, эти числа хорошо знако-
мы - их двоичная запись состоит из одних единиц. Иными словами, все эти числа на 1 меньше степеней двойки: 2-1, 4-1, 8-1, 16 - 1, 32 - 1, 64 - 1, ... Это можно доказать по индукции, а можно воспользоваться таким простым приемом: добавить к обеим частям рекуррентного соотношения по единичке и обозначить за В = Т , + 1:
п п-1
Т + 1 = 2Т , + 2 = 2(Т , + 1) или В = 2В
п п-1 4 п-1 7 п п-1
Поскольку Вх = 2ТХ = 2, получаем, что В = 2п, а значит Т = 2п - 1.
п ■ п
Задача 4.
Обозначим стержень, на котором изначально находятся диски - А, стержень, не котором диски должны в результате оказаться - В, а промежуточный стержень - С.
Изменим правила перемещения. Кроме тех, что были раньше, добавим запрет на прямое перемещение диска со стержня А на стержень В и обратно.
Уровень 1. Составьте рекуррентное соотношение для числа Рп - минимального числа перемещений башни из п дисков с одного стержня на другой по описанным правилам.
Уровень 2. Смоделируйте процесс оптимального перемещения дисков по этим правилам: если на вход подать значение £ -количество перемещенных дисков (эту величину можно трактовать как время, требуемое для перемещений), то на выходе будут три массива - А, В и С, в которых находятся натуральные числа 1, 2, 3, 4, ..., п, обозначающие величины дисков. Массивы следует взять фиксированной длины 10, а оставшиеся неиспользованными элементы массива заполнить нулями. Увеличивать размер задачи, то есть число дисков не советуем, дабы не ждать окончания работы программы до конца света.
Уровень 3. Выведите замкнутую форму величины Рп.
Задание 5.
Изменим в предыдущей задаче ограничение следующим образом: переносить диск запрещается только напрямую со стер-
жня А на стержень В (а обратно уже разрешается).
Уровень 3. Проведите полное исследование этой задачи.
РАЗМЕН МОНЕТ
Не в каждой задаче удается легко построить замкнутую форму решения. Рекуррентные отношения позволяют описать более широкий класс задач. Рассмотрим задачу, которая раньше называлась размен монет, а сейчас (в связи с малым их использованием) назовем ее «размен купюр». У нас есть купюры достоинством в 5, 10, 50, 100 и 500 рублей в неограниченном количестве (!). Надо разменять купюру в 1000 рублей. Сколькими способами это можно сделать?
Значения всех купюр кратны 5, поэтому если взять 5 за единицу (ввести новую валюту, например), то задача займет меньше места: сколькими способами число 200 можно представить в виде слагаемых, значения которых равны 1, 2, 10, 20, 100 (разумеется, порядок слагаемых роли не играет).
Обозначим искомое число способов за Rn, тогда R = R 1 + R 0 + R 1А + R 0 А + R А.
n n-1 n-2 n-10 n-20 n-1UU
Объяснить это нетрудно. Раз порядок слагаемых нас не интересует, можно расположить их по возрастанию. Тогда наша сумма будет начинаться либо с 1, либо с 2, либо с 10, либо с 20, либо с 100. В каждом из этих случаев мы можем посчитать число способов разложить оставшуюся сумму. По-
скольку других вариантов начала суммы нет, общее число комбинаций равно искомому.
Задание 6.
Уровень 1.
a) К этому рекуррентному соотношению надо добавить начальные условия, какие? Сколько их? Можно ли уменьшить их число за счет выписывания вспомогательных рекуррентных отношений?
b) Выразите через Rn число разложений в состав которых обязательно входит единица.
Уровень 2. Составьте программу, вычисляющую количество представлений числа 200 в виде суммы слагаемых 1, 2, 10, 20, 100 (без учета порядка).
Уровень 3. Составьте программу для подсчета количества способов разложения числа N в сумму слагаемых 1, 2, 10, 20, 100, если количество слагаемых 1 ограничено числом ср количество слагаемых 2 ограничено числом с2 и так далее - остальные границы соответственно с10, с20, с100.
РЕКУРРЕНТНЫЕ ФОРМУЛЫ И РЕКУРСИЯ
На рекуррентное отношение, определяющее числа Фибоначчи, можно посмотреть иначе - как на их рекурсивное определение. В этом случае программа вычисления чисел Фибоначчи будет двигаться «в обратном направлении» - от определения к начальным значениям. Процесс этот обычно изображают в виде дерева. Напри-
Иро/есс обш^о (¿■рбрафатб. & &xfe уере&а.
мер, дерево вычислений /4 изображено на рисунке 1.
Задание 7.
Сравним два способа вычисления чисел Фибоначчи. Для прямого - рекуррентного - способа нам надо хранить в памяти всего два текущих числа. А сколько памяти понадобится для обратного вычисления числа Фибоначчи по рекурсивному определению?
Уровень 1. Напишите рекуррентную формулу для вычисления числа
a) вершин дерева рекурсий числа Фибоначчи /;
b) вершин, помеченных числом /г
Выразите эти числа через числа Фибоначчи.
Мы видим, что использование рекурсии приводит к быстрому росту требуемой памяти. Для тех, кто нашел замкнутую формулу для чисел Фибоначчи, можем уточнить - «экспоненциальному росту».
...рассмотрим более беуобиуЯфл Терема¿лфлш — до&скфа сги&лмякц.
ЗАДАЧА ИОСИФА ФЛАВИЯ
Эта задача связана с легендой об известном историке первого века Иосифе Флавии. В этой легенде говорится о том, что он выжил и стал известным благодаря математической одаренности. В ходе иудейской войны он в составе отряда из 41 воина был загнан римлянами в пещеру. Предпочитая самоубийство плену, воины решили выстроиться в круг и последовательно убивать каждого третьего из живых до тех пор, пока не останется ни одного живого человека. Однако Иосиф, наряду с одним из своих единомышленников, счел подобный конец бессмысленным - он быстро вычислил спасительные места в круге, на которые поставил себя и своего товарища.
Оставим в стороне этическую сторону поступка Иосифа Флавия и рассмотрим более безобидную версию задачи - детскую считалочку.
Пусть по кругу стоят п человек, начинают считать с 1-го, и каждый к-ый выбывает. Кто останется водить?
Задание 8.
Уровень 1. Проведите несколько экспериментов для разных значений п и к (1 < п < 10, 2 < к < 5) и результаты занесите в табличку. Напишите, какие закономерности Вы видите в этой табличке.
Уровень 2. Напишите программу, которая при вводе п и к выдает номер того, кто будет водить.
Уровень 3. Предположим, что в игре может участвовать от 3 до 20 человек, то есть п заранее неизвестно, поэтому просчитать игру заранее нельзя, значение к определяется в момент начала считалочки. Сформулируйте и обоснуйте ряд простых советов участнику игры, куда лучше встать, чтобы с меньшей вероятностью водить. Не беря ответственность за качество, приведем два примера таких советов: «если к - четное, то не становиться на четные места», «лучше всего стоять рядом с тем, с кого начинают считать». Для формулировки таких советов проведите компьютерный экспери-
мент, который статистически оценивает «качество» совета, то есть процент случаев, когда он «сработал», для различных значений п и к (3 < п < 20, 2 < к < 7). Интересно было бы на вход программы подавать «совет» в некоторой формализованной форме, а программа должна выдавать его «качество».
Разберем теперь случай к = 2, то есть когда выбирают каждого второго.
На рисунке 2 изображен результат считалки для четного числа человек после первого прохода. В этом случае выбывают все игроки, стоящие на четных местах, а второй проход считалки опять начинается с первого игрока. Это все равно, как если бы мы начинали с вдвое меньшего числа людей, но номер каждого бы удваивался и уменьшался на 1.
Новые номера 1 2 3 4 n
Старые номера 1 3 5 7 2n -1
Если мы обозначим /(п) - номер водящего после применения считалки к п игрокам, то получим рекуррентную формулу: /(п) = 2/(п/2) - 1 Посмотрим теперь, что будет в случае нечетного числа игроков. После выбывания всех игроков с четными номерами выбывает первый игрок и счет для нового прохода начинается уже с номера 3 (рисунок 3).
В этом случае мы опять можем ввести новые номера и свести задачу к более простой. Но закон, связывающий новые номера со старыми, будет иной.
Новые номера 1 2 3 4 n
Старые номера 3 5 7 9 2n +1
Соответственно, другой будет и рекуррентная формула для участника, остающегося водить:
/(п) = 2/((п - 1)/2) + 1 Заметим, что (п - 1)/2 в этой формуле показывает, сколько игроков остается на второй круг.
Рисунок 2.
Итак, получается такая рекуррентная зависимость:
/(n) = 1,
/(n) = 2/(n/2) - 1, если n четное,
/(n) = 2/((n - 1)/2) + 1, если n нечетное.
Задание 9.
Уровень 1. Посчитайте по этой формуле /(1000).
Уровень 2. Напишите программу, которая по вводу n выдает /(n). Здесь полагаем, что n описывается типом integer.
Посмотрим, что нам дает рекуррентная формула. При выполнении задания 8 (уровень 2) нам нужно было хранить номера всех n игроков (если, конечно, Вы уже не вывели рекуррентную формулу сами!). Таким образом, объем памяти, требуемый для решения задачи, менялся пропорционально «размеру задачи», как для таких целей именуют число n. Теперь мы можем организовать рекурсивное вычисление /(n). Интуитивно ясно, что для этого понадобится гораздо меньше памяти, ведь за одно вычисление мы будем уменьшать n не менее чем вдвое.
Уровень 3. Напишите точную формулу для объема памяти, необходимого для вычисления числа /(n) рекурсивно.
Рисунок 3.
Рисунок 4.
А нельзя ли вообще обойтись без дополнительной памяти для вычислений /(и), то есть ограничиться только памятью для хранения самого числа и?
Оказывается, можно!
Теорема. Если и = 2т + к, где т, к - целые, причем т > 0, 0 < к < 2т, то /(и) = 2и + 1.
Задание 10.
Уровень 1. Вычислите по этой формуле /(1000000).
Уровень 2. Напишите программу, которая при вводе массива с цифрами числа и в двоичной системе на выходе дает массив с двоичными цифрами числа /(и).
Уровень 3. Исследуйте числа /(/(.../(и))...). Обратите внимание, что с некоторого момента дальнейшее вычисление функции / не приводит к изменению результата. Объясните этот эффект. Найдите способ, как по двоичной записи числа и определить результат «бесконечного» применения функции /.
РЕКУРРЕНТНЫЕ СООТНОШЕНИЯ ОТ НЕСКОЛЬКИХ ПЕРЕМЕННЫХ
ЗАДАЧА ПРО ДОМИНО
Задача.
Имеется полоска шириной 2 клеточки и длиной и клеточек. Мы хотим замостить ее костяшками домино размером 2 X 1. Костяшки можно класть вертикально и горизонтально. Сколькими способами это можно сделать, если ровно к из костяшек стоят
вертикально, а остальные горизонтально (рисунок 4)?
Решение.
Обозначим число таких способов Ми; к).
Если первая костяшка стоит вертикально, то остается замостить полоску размером 2 X (и- 1), что можно сделать М(и - 1, к - 1) способами. Если же первая костяшка лежит горизонтально, то под ней (или на ней) должна обязательно быть еще одна такая же. Таким образом, остается замостить полоску размера 2 X (и - 2), что можно сделать М(и - 2, к) способами.
Получаем рекуррентное соотношение М(и; к) = М(и - 1, к - 1) + М(и - 2, к).
Оно содержит две переменные и и к, поэтому для вычисления М(и, к) нужно знать все предыдущие значения, которых и-(к - 1) + к-(и - 1). Для вычислений можно использовать массив с двумя переменными.
Задание 11.
Уровень 1. Для вычислений М(и, к) нужны начальные значения. Сколько таких значений нужно? Напишите замкнутые формулы для вычисления начальных значений.
Уровень 2. Напишите программу для вычисления М(и, к) по заданным значениям и и к, используя для хранения промежуточных данных массив от двух переменных. Можете ли Вы предложить более удобную структуру данных, чем массив?
Рассмотрим теперь пример, когда рекуррентная формула зависит от очень большого числа переменных: настолько большого, что мы даже не будем пытаться их явно перечислять.
РАСКРАСКА ГРАФА Задача.
Сколькими способами можно раскрасить вершины заданного графа так, чтобы вершины, соединенные ребром, имели разный цвет? Всего разрешается использовать к различных цветов (рисунок 5).
Написать явную рекуррентную формулу мы не можем, поскольку не знаем каков граф. Однако мы можем разбить все раскраски на два класса и подсчитать число раскрасок в каждом из классов, а потом сложить. Найдем две вершины графа, не соединенные ребром, тогда возможны два случая раскраски: либо эти вершины окрашены в один цвет, либо в разные цвета. В первом случае эти вершины можно «склеить» в одну и свести задачу к подсчету числа раскрасок графа с меньшим на единицу числом вершин. В другом случае, наоборот, можно добавить ребро, соединяющее эти вершины. При этом раскраска останется правильной, так как мы соединяем разно-окрашенные вершины.
Условно эту рекуррентную формулу можно изобразить так:
N = N + N
1УВ В Е
На первый взгляд может показаться, что, увеличивая число ребер, мы усложняем задачу, но это не так. Рассмотрим, например, крайний случай, когда все п вершин графа соединены (такой граф называется полным и обозначается К ). В этом
п'
случае подсчет числа раскрасок очень прост: окраску начнем с любой вершины. Ее мы можем раскрасить в любой из к цветов. Возьмем любую другую вершину. Она соединена с первой ребром, поэтому ее можно окрасить в любой из к - 1 цветов. Всего комбинаций раскраски будет к(к - 1). Далее берем третью вершину, она соединена с двумя предыдущими, поэтому для нее можно выбрать любой цвет, кроме двух уже выбранных. Всего будет к(к - 1)(к -2) комбинаций. Продолжая подсчет дальше, получим теорему.
Рисунок 5.
Теорема. Число раскрасок полного графа с п вершинами к красками равно
к! = к -(к -1) -(к -2) • ... • 3 • 2 • 1.
На рисунке 6 показан пример п = 3,
к = 3.
Таким образом, наш метод ведет либо к уменьшению вершин графа, то есть к более простым графам, либо к полным графам, число раскрасок которых мы знаем.
Применяя нашу рекуррентную формулу, мы всегда можем свести задачу к раскраске полного графа.
фсол-шими способами мо^Но раскраси&ь ¿ЛфАККого графа...
Црилер.
Сколькими способами можно раскрасить вершины четырехугольника в 4 цвета?
На рисунке 7 показан в символической форме ход решения.
Справа получились четыре полных графа: один с четырьмя вершинами, два - с тремя, один - с двумя.
Таким образом, ответ: 4 х3х2х1 + + 3x2 х1 + 3x2x1 + 2x1 = 24 + 6 + 6 + 2 = = 38
Задание 12.
Уровень 1. Посчитайте, сколькими способами можно раскрасить вершины пятиугольника в
a) два цвета,
b) три цвета,
c) четыре цвета, ё) пять цветов, е) шесть цветов.
Уровень 2. Пусть граф имеет вершины, занумерованные числами 1, 2, 3, ..., и. Ребра графа заданы массивом £(г, у); если вершины г и у соединены ребром, то £(г, у) равно 1, иначе 0. Заметим, что мы храним избыточную информацию, так как Е(г, у) = Щ г).
Напишите программу, которая считает число раскрасок этого графа к красками.
N = N + N = м^ + N + N +
Рисунок 7.
Литература
1. Р. Грэхеж, Д. ^нут, О. Яаташник. Конкретная математика. Основания информатики: Пер. с англ. М.: Мир, 1998.
2. F M Dong, K M Koh, K L Teo. Chromatic polynomials and chromaticity of graphs. World Scientific Publishing, 2005.
© Наши авторы, 2005. Our authors, 2005.
Поздняков Сергей Николаевич, доктор педагогических наук, профессор кафедры ВМ-2 сПбГЭТУ.