Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Целочисленные алгоритмы (язык Паскаль)

Содержание

Целочисленные алгоритмы (язык Паскаль)Тема 1. Алгоритм Евклида
Целочисленные алгоритмы  (язык Паскаль)Алгоритм ЕвклидаРешето ЭратосфенаДлинные числаЦелочисленная оптимизация Целочисленные алгоритмы  (язык Паскаль)Тема 1. Алгоритм Евклида Вычисление НОДНОД = наибольший общий делитель двух    натуральных чисел Алгоритм ЕвклидаЕвклид(365-300 до. н. э.) НОД(a,b)= НОД(a-b, b) Модифицированный алгоритм ЕвклидаНОД(a,b)= НОД(a mod b, b)     = Реализация алгоритма ЕвклидаРекурсивный вариант:function NOD (a, b: integer): integer;begin if a = Реализация алгоритма ЕвклидаБез рекурсии:function NOD (a, b: integer): integer;begin while a b Задания«4»: Составить программу для вычисления НОД и заполнить таблицу:«5»: То же самое, Целочисленные алгоритмы  (язык Паскаль)Тема 2. Решето Эратосфена Поиск простых чиселПростые числа – это числа, которые делятся только на себя Решето ЭратосфенаЭратосфен Киренский (Eratosthenes, Ερατοσθδνη) (ок. 275-194 до н.э.) Новая версия – Реализация{ сначала все числа не выколоты }for i:=1 to N do A[i] Реализацияk := 2;while k*k Задания«4»: Реализовать «решето Эратосфена», число N вводить с клавиатуры.«5»: То же самое, Целочисленные алгоритмы  (язык Паскаль)Тема 3. Длинные числа Что такое длинные числа?Задача. Вычислить (точно)100! = 1·2·3·...·99·100Проблема:  это число содержит Хранение длинных чисел1234 568901 734567 =   =  1234·10000002 + Умножение длинного числа на короткое 1234 568901 734567× Вычисление 100!const d = 1000000; { основание системы }var A: array[0..40] of Вычисление 100!len := 1;     { записать [A]=1 }A[0] Как вывести длинное число?«Первая мысль»:for i:=len-1 downto 0 do write(A[i]); Проблема: Как вывести длинное число?Процедура:procedure Write6(N: integer);var x, d: integer;begin x := 100000; Задания«4»: Составить программу для вычисления 		  99!! = 1·3·...·97·99«5»: То же Целочисленные алгоритмы  (язык Паскаль)Тема 4. Целочисленная       оптимизация Задачи целочисленной оптимизацииОптимизация:при заданных ограниченияхЦелочисленная оптимизация:x – вектор (массив) целых чиселКомбинаторная оптимизация:x Задача коммивояжераЗадача коммивояжера. Коммивояжер (бродячий торговец) должен выйти из первого города и, Метод случайных перестановокЧто представляет собой решение? перестановка чисел 2,3,...N.комбинаторная задача135241Алгоритм:записать в массив Конец фильма
Слайды презентации

Слайд 2 Целочисленные алгоритмы (язык Паскаль)
Тема 1. Алгоритм Евклида

Целочисленные алгоритмы (язык Паскаль)Тема 1. Алгоритм Евклида

Слайд 3 Вычисление НОД
НОД = наибольший общий делитель двух

Вычисление НОДНОД = наибольший общий делитель двух  натуральных чисел –

натуральных чисел – это наибольшее

число, на которое оба исходных числа делятся без остатка.

Перебор:

k := a; { или k := b; }
while (a mod k <> 0) or
(b mod k <> 0) do
k := k - 1;
writeln ('НОД(', a, ',', b, ')=', k);

много операций для больших чисел

ИЛИ


Слайд 4 Алгоритм Евклида
Евклид
(365-300 до. н. э.)
НОД(a,b)= НОД(a-b, b)

Алгоритм ЕвклидаЕвклид(365-300 до. н. э.) НОД(a,b)= НОД(a-b, b)   =


= НОД(a, b-a)
Заменяем большее из

двух чисел разностью большего и меньшего до тех пор, пока они не станут равны. Это и есть НОД.

НОД (14, 21) = НОД (14, 21-14) = НОД (14, 7)

НОД (1998, 2) = НОД (1996, 2) = … = 2

Пример:

много шагов при большой разнице чисел:

= НОД (7, 7) = 7


Слайд 5 Модифицированный алгоритм Евклида
НОД(a,b)= НОД(a mod b, b)

Модифицированный алгоритм ЕвклидаНОД(a,b)= НОД(a mod b, b)   = НОД(a,

= НОД(a, b mod a)
Заменяем большее

из двух чисел остатком от деления большего на меньшее до тех пор, пока меньшее не станет равно нулю. Тогда большее — это НОД.

НОД (14, 21) = НОД (14, 7) = НОД (0, 7) = 7

Пример:

Еще один вариант:

НОД(2·a,2·b)= 2·НОД(a, b)
НОД(2·a,b)= НОД(a, b) // при нечетном b


Слайд 6 Реализация алгоритма Евклида
Рекурсивный вариант:
function NOD (a, b: integer):

Реализация алгоритма ЕвклидаРекурсивный вариант:function NOD (a, b: integer): integer;begin if a

integer;
begin
if a = b then NOD := a

else
if a < b then
NOD := NOD(a, b-a)
else NOD := NOD(a-b, b);
end;

function NOD (a, b: integer): integer;
begin
if a*b = 0 then NOD := a+b
else
if a < b then
NOD := NOD(a, b mod a)
else NOD := NOD(a mod b, b);
end;


Слайд 7 Реализация алгоритма Евклида
Без рекурсии:
function NOD (a, b: integer):

Реализация алгоритма ЕвклидаБез рекурсии:function NOD (a, b: integer): integer;begin while a

integer;
begin
while a b do
if a

> b then a := a - b
else b := b - a;
NOD := a;
end;

function NOD (a, b: integer): integer;
begin
while a*b <> 0 do
if a > b then a := a mod b
else b := b mod a;
NOD := a + b;
end;


Слайд 8
Задания
«4»: Составить программу для вычисления НОД и заполнить

Задания«4»: Составить программу для вычисления НОД и заполнить таблицу:«5»: То же

таблицу:


«5»: То же самое, но сравнить для всех пар

число шагов обычного и модифицированного алгоритмов (добавить в таблицу еще две строчки).

Слайд 9 Целочисленные алгоритмы (язык Паскаль)
Тема 2. Решето Эратосфена

Целочисленные алгоритмы (язык Паскаль)Тема 2. Решето Эратосфена

Слайд 10 Поиск простых чисел
Простые числа – это числа, которые

Поиск простых чиселПростые числа – это числа, которые делятся только на

делятся только на себя и на 1.
Применение:
криптография;
генераторы псевдослучайных чисел.
Наибольшее

известное (сентябрь 2008):
243112609 − 1 (содержит 12 978 189 цифр).
Задача. Найти все простые числа в интервале от 1 до заданного N.
Простое решение:

for i:=1 to N do begin
isPrime := True;
for k:=2 to i-1 do
if i mod k = 0 then
isPrime := False;
if isPrime then
writeln(i);
end;


k*k <= i

O(N2)

растет не быстрее N2


Слайд 11 Решето Эратосфена
Эратосфен Киренский (Eratosthenes, Ερατοσθδνη) (ок. 275-194 до н.э.)
Новая

Решето ЭратосфенаЭратосфен Киренский (Eratosthenes, Ερατοσθδνη) (ок. 275-194 до н.э.) Новая версия

версия – решето Аткина .
1 2 3 4 5

6 7 8 9 10 11 12 13 14 15 16

Алгоритм:
начать с k = 2;
«выколоть» все числа через k, начиная с 2·k;
перейти к следующему «невыколотому» k;
если k·k <= N, то перейти к шагу 2;
напечатать все числа, оставшиеся «невыколотыми».

высокая скорость, количество операций

нужно хранить в памяти все числа от 1 до N

O((N·log N)·log log N )

2

3


Слайд 12 Реализация
{ сначала все числа не выколоты }
for i:=1

Реализация{ сначала все числа не выколоты }for i:=1 to N do

to N do A[i] := True;
{ основной цикл

«выкалывание» составных чисел }
{ выводим оставшиеся числа }
for i:=1 to N do
if A[i] then writeln(i);

Логический массив A[N], где A[i] = True, если число i не «выколото», A[i] = False, если число i «выколото».


Слайд 13 Реализация
k := 2;
while k*k

Реализацияk := 2;while k*k

if A[k] then begin





end;
k := k +

1;
end;

Основной цикл:

i := k*k;
while i <= N do begin
A[i] := False;
i := i + k;
end;

«выкалываем» все числа, кратные k


Слайд 14
Задания
«4»: Реализовать «решето Эратосфена», число N вводить с

Задания«4»: Реализовать «решето Эратосфена», число N вводить с клавиатуры.«5»: То же

клавиатуры.
«5»: То же самое, но сравнить число шагов алгоритма

для различных значений N. Построить график в Excel, сравнить сложность с линейной. Заполнить таблицу:

Слайд 15 Целочисленные алгоритмы (язык Паскаль)
Тема 3. Длинные числа

Целочисленные алгоритмы (язык Паскаль)Тема 3. Длинные числа

Слайд 16 Что такое длинные числа?
Задача. Вычислить (точно)
100! = 1·2·3·...·99·100
Проблема:

Что такое длинные числа?Задача. Вычислить (точно)100! = 1·2·3·...·99·100Проблема: это число содержит

это число содержит более 100 цифр…




Решение: хранить цифры в

виде массива, по группам (например, 6 цифр в ячейке).

100! < 100100


201 цифра

201/6 ≈ 34 ячейки


Слайд 17 Хранение длинных чисел
1234 568901 734567 =

Хранение длинных чисел1234 568901 734567 =  = 1234·10000002 +

= 1234·10000002 +
568901·10000001

+
734567·10000000

Хранить число по группам из 6 цифр – это значит представить его в системе счисления с основанием d = 1000000.

[A] = 1;
for k: = 2 to 100 do
[A] = [A]* k;
{ вывести [A] }

Алгоритм:

[A] – длинное число, хранящееся как массив

умножение длинного числа на «короткое»


Слайд 18




Умножение длинного числа на короткое
1234 568901 734567
×

Умножение длинного числа на короткое 1234 568901 734567×

3

3703 706705 203701

k

a0

a1

a2

c0

c1

c2

734567·3 = 2 203701

c0

перенос, r1

568901·3 + 2 = 1 706705



c1

r2


1234·3 + 1 = 3703

c2

c0 = ( a0·k + 0) mod d
r1 = ( a0·k + 0) / d

c1 = ( a1·k + r1) mod d
r2 = ( a1·k + r1) / d

c2 = ( a2·k + r2) mod d
r3 = ( a2·k + r2) / d
...


Слайд 19 Вычисление 100!
const d = 1000000; { основание системы

Вычисление 100!const d = 1000000; { основание системы }var A: array[0..40]

}
var A: array[0..40] of integer;
s, r,

{ произведение, остаток }
i, k, { вспомогательные }
len: integer; { длина числа }
begin
{ присвоить [A] = 1 }
{ последовательно умножать
[A] на 2, 3, ..., 100 }
{ вывести [A] }
end.

Слайд 20 Вычисление 100!
len := 1;

Вычисление 100!len := 1;   { записать [A]=1 }A[0] :=

{ записать [A]=1 }
A[0] := 1;
for i:=1 to 40

do
A[i] := 0;
for k:=2 to 100 do begin
i := 0; { с младшего разряда}
r := 0; { пока нет переноса}
while (i < len) or (r > 0) do begin
s := A[i]*k + r;
A[i] := s mod d; { в этом разряде }
r := s div d; { перенос }
i := i + 1; { к следующему разряду }
end;
len := i; { новая длина числа }
end;

пока не кончились цифры числа [A] или есть перенос


Слайд 21 Как вывести длинное число?
«Первая мысль»:
for i:=len-1 downto 0

Как вывести длинное число?«Первая мысль»:for i:=len-1 downto 0 do write(A[i]); Проблема:

do
write(A[i]);
Проблема: как не потерять первые нули при

выводе чисел, длина которых менее 6 знаков?
123 000123
Решение:
составить свою процедуру, а при выводе старшего разряда (len-1) убирать лидирующие нули:

write(A[len-1]); { старший разряд }
for i: = len-2 downto 0 do Write6(A[i] );



Слайд 22 Как вывести длинное число?
Процедура:
procedure Write6(N: integer);
var x, d:

Как вывести длинное число?Процедура:procedure Write6(N: integer);var x, d: integer;begin x :=

integer;
begin
x := 100000;
while x > 0 do

begin
d := N div x;
N := N mod x;
x := x div 10;
write(d);
end;
end;






















Слайд 23
Задания
«4»: Составить программу для вычисления
99!!

Задания«4»: Составить программу для вычисления 		 99!! = 1·3·...·97·99«5»: То же

= 1·3·...·97·99
«5»: То же самое, но написать свою процедуру

для вывода, использующую символьные строки.

«6»: Написать программу для умножения двух длинных чисел (ввод из файла).

«7»: Написать программу для извлечения квадратного корня из длинного числа (ввод из файла).

Слайд 24 Целочисленные алгоритмы (язык Паскаль)
Тема 4. Целочисленная

Целочисленные алгоритмы (язык Паскаль)Тема 4. Целочисленная    оптимизация

оптимизация


Слайд 25 Задачи целочисленной оптимизации
Оптимизация:
при заданных ограничениях
Целочисленная оптимизация:
x – вектор

Задачи целочисленной оптимизацииОптимизация:при заданных ограниченияхЦелочисленная оптимизация:x – вектор (массив) целых чиселКомбинаторная

(массив) целых чисел
Комбинаторная оптимизация:
x – вектор (массив) целых чисел,

причем все его элементы принадлежат заданному набору чисел

при малом количестве вариантов можно решить простым перебором

при большом количестве вариантов на решение перебором может потребоваться огромное время (для ряда задач другие алгоритмы неизвестны)


Слайд 26 Задача коммивояжера
Задача коммивояжера. Коммивояжер (бродячий торговец) должен выйти

Задача коммивояжераЗадача коммивояжера. Коммивояжер (бродячий торговец) должен выйти из первого города

из первого города и, посетив по разу в неизвестном

порядке города 2,3,...N, вернуться обратно в первый город. В каком порядке надо обходить города, чтобы замкнутый путь (тур) коммивояжера был кратчайшим?

Точные методы:
простой перебор;
метод ветвей и границ;
метод Литтла;

Приближенные методы:
метод случайных перестановок (Matlab);
генетические алгоритмы;
метод муравьиных колоний;

большое время счета для больших N

O(N!)

не гарантируется оптимальное решение


Слайд 27 Метод случайных перестановок
Что представляет собой решение? перестановка чисел 2,3,...N.
комбинаторная

Метод случайных перестановокЧто представляет собой решение? перестановка чисел 2,3,...N.комбинаторная задача135241Алгоритм:записать в

задача
1
3
5
2
4
1





Алгоритм:
записать в массив x перестановку 2 3

… N найти длину маршрута 1 2 3 … N 1 и записать ее в Lmin;
выбрать случайно два элемента массива x и поменять их местами;
найти длину маршрута, соответствующего x и, если она меньше Lmin, записать ее в Lmin и запомнить перестановку;
если число шагов меньше заданного, перейти к шагу 2.

  • Имя файла: tselochislennye-algoritmy-yazyk-paskal.pptx
  • Количество просмотров: 150
  • Количество скачиваний: 1