Университет города Переславля Дистанционный курс "Математические вычисления в системе MuPAD" С.В.Дужин, duzhin@u-aizu.ac.jp Задание 2. Численный счет 10.04.96 Собирался я написать второе задание в понедельник, потом во вторник, -- и, наконец, собрался в среду. Лучше поздно, чем никогда. Не правда ли? Для начала я сделаю обзор полученных мною писем, в которых нашел много интересного. Для разминки приведу следующую цитату: >Я здесь по MuPad'у полазила. Мышкой потыкала. >Усвоила команду quit. Посчитала 2+2, а также другие примеры. Вот интересные впечатления о русском языке: >Na russkom ya pisat mogu, no ne hochu, t.k. po russki mojno pisat tolko >kogda otsilaesh pismo. >Ia mogu pisat i polucht pisma na russkom, no poka > prihoditsa pisat vot tak Первого из этих двух авторов я понимаю: человек может, но не хочет. А второго понять довольно трудно. Что имел в виду автор, говоря, что он "может так", но "приходится этак"? Ну ладно, это все шутки, а теперь перейдем к интересным наблюдениям математического характера. Sergey Samoylov пишет: >When we computed int(tan(x),x) we got strange result with vertical sticks >between numbers. I know that answer must look like -ln(cos(x)), but >it wasn't so. Ответ, который дает MuPAD, на самом деле выглядит так (я переписал его в строку): int(tan(x),x) = I x - ln(exp(I x)^2 + 1) Здесь I -- это не черточка, а число i (корень квадратный из -1). В своем ответном письме Самойлову я сказал, что ответ этот тоже правильный (!) -- как и тот ответ, что он сам предложил "из головы", а чтобы проверить его, надо: > Try to recall what I tought you last year and prove that for > any real number x > I x - ln(exp(I x)^2 + 1) = tan(x). К сожалению, здесь была опечатка. На самом деле, я предлагаю ему -- и всем -- проверить правильность ответа, данного компьютером, следующим образом: Задача 2-1. Доказать, что производная функции I x - ln(exp(I x)^2 + 1) равна tan(x) (т.е. тангенсу x). Далее, Роман Дмитриев пишет: >V otvet na komandu >>int(1/x,x = 1 .. 2);mi poluchili: >ne konkretnoe chislo a nechto pohozhee na nachalnuyu zapis. Это интересное наблюдение. По идее, ответ должен быть ln(2). Если попробовать неопределенный интеграл: >int(1/x,x); -- то получается ln(x). Можно найти численное значение исходного примера, навешивая float: >float(int(1/x,x = 1 .. 2)); Но заставить MuPAD дать ответ ln(x) у меня не вышло. Вопрос 2-2. Не знает ли кто-нибудь, как это сделать? И, наконец, от творческой четы М.Федосовой и И.Кишкилевой поступила такая загадка: | >>6:3; | 3 | Почему она выдает цифру '3'? Мне она настолько понравилась, что я не хочу сразу рассказывать ответ и предлагаю подумать над ней всем: это будет Загадка 2-3. Перейдем к "новому материалу". Сегодня я хочу предложить вам поупражняться с MuPAD'ом как с калькулятором, позволяющим вести вычисления с неограниченной точностью. Слово "неограниченная точность" означает, что любой ответ можно получить с любой точностью, т.е. с любым количеством цифр, которое ограничено только памятью компьютера. Если счет идет с целыми или рациональными числами (обыкновенными дробями), то ответ всегда пишется полностью, сколько бы цифр он ни занимал. Попробуйте вычислить 1000! = 1*2*3*...*1000: > fact(1000); Задача 2-4. Какое число больше: 1000! или 2^8000 ? Если счет происходит с десятичными дробями (т.е. с приближенными вещественными числами), то по умолчанию ответ выдается с точностью до 10 значащих цифр. Попробуйте: > float(sqrt(2)); > float(sqrt(20000000000)); Чтобы получить более точный ответ, надо изменить значение системного параметра DIGITS следующим образом (например): > DIGITS:=50; Повторите теперь две предыдущие команды (перепечатывать их не надо, достаточно сдвинуть курсор вверх и нажать enter в нужной строке). Задача 2-4. Найдите значение знаменитых констант "e" и "пи" с точностью до 80 знаков. Позанимаемся немного арифметикой целых чисел. Арифметические операции записываются так: +, -, *, /, ^. Обратите внимание, что деление записывается не двоеточием, а косой чертой. Пример: > (2^(2^5)+1)/641; Вопрос 2-5. Что обозначает 2^(2^5) и в чем отличие этого выражения от 2^2^5 и от (2^2)^5? В предыдущем примере получилось целое число. Факт, казалось бы, не заслуживающий внимания, но сыгравший большую роль в истории математики. Кажется, в прошлом году своим студентам я про это рассказывал (я могу это проверить, когда приду домой: там у меня лежит конспект Зиновьевой). Кажется, и первокурсникам про это рассказывали. Но я напомню. В 17 веке Пьер Ферма (автор знаменитой теоремы, которая была доказана лишь в 1994 году) заметил, что все числа вида 2^(2^n)+1 для n=0,1,2,3,4: 2^0+1 2^1+1 2^2+1 2^4+1 2^16+1 -- простые, и предположил, что этот факт имеет место для всех натуральных значений числа n. Однако, спустя 80 лет Эйлер обнаружил, что 2^(2^5)+1 -- число составное, а именно, оно делится нацело на 641. Мы это только что проверили. Но даже если бы мы не знали делителей этого числа, мы могли бы их быстро найти командой факторизации целых чисел ifactor. Попробуйте: > ifactor(2^(2^5)+1); Вопрос 2-6. Поэкспериментируйте с командой ifactor и объясните мне формат ответа, который она выдает: что обозначают цифры в квадратных скобках? Итак, для данного целого числа при помощи команды ifactor вы можете определить, простое оно или составное и, если составное, найти его разложение на простые сомножители. Алгоритм разложения устроен так, что если у числа есть маленький простой делитель, то он находится очень быстро. Но если все простые делители достаточно велики, то их поиск, как правило, занимает большое время. На этом наблюдении основаны некоторые алгоритмы кодирования информации, которые используются в некоторых коммерческих программах шифрования. Допустим, A и B -- два больших простых числа (скажем, по 20-30-40-50 цифр в каждом). Тогда из произведение A*B не имеет других делителей, кроме самих A и B и разложить его на множители чрезвычайно трудно. А для расшифровки нужно как раз знать эти сомножители. Как же придумать такие большие простые числа? Путем научного эксперимента. Вот я, кстати, пока это писал, в другом окошке провел такой эксперимент, нашел простое число из 20 знаков и задал мюпаду его разложить на множители. Мюпад упирался все время, пока я писал текст, но так и не смог... Хорошо, в меню есть команда Interrupt! Так откуда же я взял это число? Способ простой. Пишешь ifactor(...), а в скобках наугад любое длинное число. Жмешь enter и смотришь на разложение (если оно появляется). В разложении все сомножители простые -- по определению. > ifactor(98882225982226895349368109); [1, 3, 1, 71, 1, 19553, 1, 23742433525978601881, 1] Ага, попалось: 23742433525978601881. Давайте другое поищем: > ifactor(926895349377768109); [1, 926895349377768109, 1] На этот раз число получилось сразу простое. Но вот, теперь берем >x:=23742433525978601881*926895349377768109; и предлагаем товарищу разложить его на множители. То-то он посидит у экрана, ожидаючи. По этому поводу я объявляю два конкурса. Конкурс 1-й. Кто найдет самое большое простое число? Конкурс 2-й. Кто найдет самое МАЛЕНЬКОЕ составное число, которое командой ifact не разлагается на множители за 1 минуту? Ответов жду до 17 апреля (крайний срок отправки 16-е).