Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2020, 12:41   #11
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Это обычный итерационный метод - берем первое приближение, делим, получаем два числа, произведение которых равно подкоренному. Второе приближение получается как среднее арифметическое этих чисел. Если надо считать корень большей степени, всё то же самое, но делить надо (n-1) раз:
Код:
>>> def root(x, n):
...   u, v = 1, x//n
...   while abs(u-v) > 10:
...     r = x
...     for _ in range(1, n):
...         r //= v 
...     u, v = v, (r + v*(n-1)) // n
...   return v
... 
>>> root(2*10**300, 3)
12599210498948731647672106072782283505702514647015079800819751121552996765139594837293965624362550941
Black Fregat вне форума Ответить с цитированием
Старый 30.01.2020, 16:05   #12
DoctorDeathDDrac
Пользователь
 
Регистрация: 18.01.2020
Сообщений: 17
Радость

Программа опять же таки работает, но выводит количество символов обратно пропорциональное степени корня, то есть вместо 300 знаков при кубическом корне(3), как я понял число триста в случае с квадратным корнем отвечает за количество знаков, программа выведет 100 знаков, причем в квадратном корне количество знаков сохраняется 300, 300. Есть выход написать как-то так (x * 10 ** (300*n), ) с циклом if (тк при квадратном корне количество "символов" сохраняется 300, 300), если корень квадратный, тогда ..n*1 . Кстати время выполнения команды обратно пропорционально степени корня. И в итоге одна команда выполняется около 2х минут в степени 8 и количестве "знаков" 10^4 и символьно короче в те же 8 раз. Я могу спокойно ввести условие if, но прийдется долго ждать, есть ли способ произвести вычисления быстрее или хотя бы без уменьшения количества выводимых символов?
Кстати, может возможно выводить по 100 знаков, а потом начинать вычисления с той же цифры? То есть вычисление блоками

Последний раз редактировалось DoctorDeathDDrac; 31.01.2020 в 08:04.
DoctorDeathDDrac вне форума Ответить с цитированием
Старый 01.02.2020, 09:30   #13
DoctorDeathDDrac
Пользователь
 
Регистрация: 18.01.2020
Сообщений: 17
По умолчанию

Цитата:
Сообщение от DoctorDeathDDrac Посмотреть сообщение
Программа опять же таки работает, но выводит количество символов обратно пропорциональное степени корня, то есть вместо 300 знаков при кубическом корне(3), как я понял число триста в случае с квадратным корнем отвечает за количество знаков, программа выведет 100 знаков, причем в квадратном корне количество знаков сохраняется 300, 300. Есть выход написать как-то так (x * 10 ** (300*n), ) с циклом if (тк при квадратном корне количество "символов" сохраняется 300, 300), если корень квадратный, тогда ..n*1 . Кстати время выполнения команды обратно пропорционально степени корня. И в итоге одна команда выполняется около 2х минут в степени 8 и количестве "знаков" 10^4 и символьно короче в те же 8 раз. Я могу спокойно ввести условие if, но прийдется долго ждать, есть ли способ произвести вычисления быстрее или хотя бы без уменьшения количества выводимых символов?
Кстати, может возможно выводить по 100 знаков, а потом начинать вычисления с той же цифры? То есть вычисление блоками
Нет, с двойкой та же фигня, вообщем я разобрался как это работает
DoctorDeathDDrac вне форума Ответить с цитированием
Старый 01.02.2020, 23:53   #14
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от DoctorDeathDDrac Посмотреть сообщение
есть ли способ произвести вычисления быстрее
Например, можно вычислить 100 знаков и взять их как первое приближение для 200 знаков и т.д.
Black Fregat вне форума Ответить с цитированием
Старый 03.02.2020, 21:41   #15
DoctorDeathDDrac
Пользователь
 
Регистрация: 18.01.2020
Сообщений: 17
По умолчанию

Как делать приближение, хотя бы математически?
DoctorDeathDDrac вне форума Ответить с цитированием
Старый 03.02.2020, 22:04   #16
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Сейчас первое приближение вычисляется в первой строке процедуры, как x // n
Если передавать его через параметр, можно использовать результат предыдущего шага
Примерно так:
Код:
>>> def root(x, n, v0 = None):
...   u, v = 1, v0 if v0 else x//n
...   while abs(u-v) > 10:
...     r = x
...     for _ in range(1, n):
...             r //= v 
...     u, v = v, (r + v*(n-1)) // n
...   return v
... 
>>> v1 = root(2*10**300, 3)
>>> v1
12599210498948731647672106072782283505702514647015079800819751121552996765139594837293965624362550941
>>> v2 = root(2*10**600, 3, v1*10**100)
>>> v2
125992104989487316476721060727822835057025146470150798008197511215529967651395948372939656243625509415431025603561566525939902404061373722845911030426935524696064261662500097747452656548030686718540551
>>> v3 = root(2*10**900, 3, v2*10**100)
>>> v3
1259921049894873164767210607278228350570251464701507980081975112155299676513959483729396562436255094154310256035615665259399024040613737228459110304269355246960642616625000977474526565480306867185405518689245872516764199373709695098382783161399155129313695366183947463448576570303119095895984741105981
Black Fregat вне форума Ответить с цитированием
Старый 03.02.2020, 22:24   #17
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Если автоматизировать процесс, то примерно так:
Код:
def rootM(x, n, m):
  step = 100
  v = 1
  for _ in range(m):
    x *= 10**(n*step)
    v *= 10**step
    v = root(x, n, v)
  return v
Тысячу шагов за несколько минут отщёлкала - сто тысяч знаков
Зачем Вам такая точность?

Последний раз редактировалось Black Fregat; 03.02.2020 в 22:41.
Black Fregat вне форума Ответить с цитированием
Старый 04.02.2020, 16:29   #18
DoctorDeathDDrac
Пользователь
 
Регистрация: 18.01.2020
Сообщений: 17
По умолчанию

А что последняя программа должна получать на вход чтобы запустить цикл?
Типо такого rootM(2*10**300, 3, 100)?
3 - это степень
300 - это количество символов
а 100 это количество циклов
Я всё правильно понял?
Да, и за что отвечает step ?

Последний раз редактировалось DoctorDeathDDrac; 04.02.2020 в 21:09.
DoctorDeathDDrac вне форума Ответить с цитированием
Старый 04.02.2020, 21:36   #19
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Код:
rootM(2, 3, 1000)
На 10**300 она сама будет умножать на каждом шаге
step - это как раз степень доумножения, то есть сколько цифр будет вычисляться нв каждом шаге
1000 шагов по 100 - 100 000 цифр
Black Fregat вне форума Ответить с цитированием
Старый 04.02.2020, 21:45   #20
DoctorDeathDDrac
Пользователь
 
Регистрация: 18.01.2020
Сообщений: 17
По умолчанию

Кстати мне для ускорения предложили использовать какую-то фичу с @jid(nopython=True), это работает?
Да и насчет числа 10 ** >>300<< оно вообще играет роль? Просто как бы я его не менял количество символов не меняется

Последний раз редактировалось DoctorDeathDDrac; 04.02.2020 в 22:00.
DoctorDeathDDrac вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Python] Дано натуральное число n. Найти все числа меньшие Мр числа Мерсенна. Джина Ким Помощь студентам 0 18.05.2018 18:39
Delphi. Цикл While. Вывести целые числа от А до В, А вывести 1 раз, число А+1 вывести 2 раза и т.д. schibeki Помощь студентам 4 07.02.2014 09:17
Множества: Даны целые числа а1,.....,Аn. Вывести на печать сообщение - имеется ли в последовательности х повторяющиеся числа lialia Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 21:11
Вывести числа, из диапазона от n до m у которых, количество единичных разрядов в двоичном представлении числа нечетно sheff123 Помощь студентам 8 05.01.2012 15:35
Как числа в двоичном виде вывести в столбик по 4 числа? Equalizer Общие вопросы C/C++ 11 27.09.2009 14:15