|
Очень нужна помощь в оптимизации алгоритма извлечения квадратного корня |
|
|
|
Dec 5 2012, 03:37
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Если нужна только целая часть квадратного корня, то можно воспользоваться другим алгоритмом:
Для квадратов чисел верны следующие равенства: 1 = 1^2 1+3 = 2^2 1+3+5 = 3^2 и так далее.
То есть, узнать целую часть квадратного корня числа можно, вычитая из него все нечётные числа по порядку, пока остаток не станет меньше следующего вычитаемого числа или равен нулю, и посчитав количество выполненных действий. Например, так: Выполнено 3 действия, квадратный корень числа 9 равен 3.
Недостатком такого способа является то, что если извлекаемый корень не является целым числом, то можно узнать только его целую часть, но не точнее. В то же время такой способ вполне доступен детям, решающим простейшие математические задачи, требующие извлечения квадратного корня.
Циклов конечно будет больше, зато время их выполнения гораздо меньше
|
|
|
|
|
Dec 5 2012, 06:09
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Цитата(alexeyv @ Dec 5 2012, 06:37)  1 = 1^2 1+3 = 2^2 1+3+5 = 3^2 и так далее. Забавный алгоритм)) Т.е. если я Вас правильно понял, то программа должна выглядеть так: a=подкоренное выражение b=1 i=1 цикл если b > a или b = a то ....выход (результат в i) иначе ....b=b+(b+2) ....i=i+1 повтор цикла Так?
Сообщение отредактировал Rostislav - Dec 5 2012, 06:30
|
|
|
|
|
Dec 5 2012, 06:28
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Rostislav @ Dec 5 2012, 10:09)  Забавный алгоритм)) Что Вас так забавляет? Немного школьной арифметики... Сумма арифметической прогрессии дает - сумма N нечетных чисел в точности равна N в квадрате. Следующий разряд (после точки) можно вычислить как (половина остатка)/N.
|
|
|
|
|
Dec 5 2012, 06:59
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Rostislav @ Dec 5 2012, 10:55)  Где-то ошибка( Код ........b=b+(b+2) просто b=b+2 a=a-b (эх и ужос этот ваш паскаль.. да ещё без тега code)
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Dec 5 2012, 07:11
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Кстати, детская арифметика заканчивается начиная с sqr (36). Результат 5! Цитата(MrYuran @ Dec 5 2012, 09:59)  Код ........b=b+(b+2) просто b=b+2 a=a-b Ага, спасибо, все заработало! В итоге sqr (10000) вычисляется за 100 шагов. Оптимизации не получилось. Можно попробовать изменить его под переменную базу. Сейчас мы прибавляем 2, а можно начинать, например, с 16 последовательно уменьшая это число в двое. Если конечно это сработает. Буду думать... Цитата(MrYuran @ Dec 5 2012, 09:59)  (эх и ужос этот ваш паскаль.. да ещё без тега code) Ну да, вот так и мучаюсь всю жизнь!))
Сообщение отредактировал Rostislav - Dec 5 2012, 09:25
|
|
|
|
|
Dec 5 2012, 11:04
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Цитата(skyv @ Dec 5 2012, 13:59)  Я использовал просто таблицу А Вы можете привести пример? Мне нужно как-то оценить эффективность такого подхода. Сейчас я не могу сделать никаких выводов. Я знаю, что существуют табличные вычисления, но все нужно проверять в живую)
|
|
|
|
|
Dec 5 2012, 11:39
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765

|
Цитата(MrYuran @ Dec 5 2012, 14:28)  Можно скомбинировать. Таблицу для грубого определения и дальше уточнять. Спасибо! Изучаю Вавилонский способ. Оказывается древние не только воевать умели) Я пока с комбинированием не хочу связываться. Нужно выжать максимум из того, что сейчас наработано. Мне кажется, что потенциал есть у обоих алгоритмов. А о комбинировании различных методов мысля уже проскальзывала, но хочется сделать монолитно-красиво)
|
|
|
|
|
Dec 6 2012, 10:52
|
Частый гость
 
Группа: Участник
Сообщений: 181
Регистрация: 26-07-10
Пользователь №: 58 606

|
Цитата(Lmx2315 @ Dec 5 2012, 15:14)  ..могу предположить что таблица - массив , где адрес - подкоренное выражение, значение массива - корень . Так и есть. В этом случае операция вычисления (в принципе чего угодно) сводится к чтению ячейки массива.
|
|
|
|
|
Dec 8 2012, 21:23
|
Местный
  
Группа: Свой
Сообщений: 221
Регистрация: 10-12-05
Из: Украина
Пользователь №: 12 052

|
Вот функция корня по алгоритму CORDIC Код function SQROOT(x1:integer) return integer is variable m,n,i, a, x,y,b: INTEGER; constant bn:integer:=28; begin y:=x1; x:=x1; m:=1; n:=bn/2; L1: for i in 1 to n loop a:=4*x; exit L1 when a>=2**(bn); y:=2*y; x:=a; end loop; L2:for i in 1 to n-1 loop b:=x+x/2**m; a:=b+b/2**m; if a<2**(bn) then x:=a; y:=y+y/2**m; end if; m:=m+1; end loop; return y/(2**n); end;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|