" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1838620@news.rsdn.ru... > Мне нужно получить число возведением в степень > 2^p, где р порядка p=2^30 > но мне нужно не все число а его часть от м-3 до м-р , где м задаеться > > делаеться это представление числа как полином ньютона но у меня не получилось > лимит времени вычисления 1-1,5 минуты на современном ПК > > если пожете подскажите
int x = (1 << p) & ~((1 << n) - 1);
Только вычисляется это выражение не 1-1.5 минуты, а наносекунды.
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Аноним, Вы писали:
А>Мне нужно получить число возведением в степень А>2^p, где р порядка p=2^30 А>но мне нужно не все число а его часть от м-3 до м-р , где м задаеться
Наверное, я еще не проснулся, но что означает выделенное?
А>делаеться это представление числа как полином ньютона но у меня не получилось А>лимит времени вычисления 1-1,5 минуты на современном ПК
А>если пожете подскажите
R>" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1838620@news.rsdn.ru... >> Мне нужно получить число возведением в степень >> 2^p, где р порядка p=2^30 >> но мне нужно не все число а его часть от м-3 до м-р , где м задаеться >> >> делаеться это представление числа как полином ньютона но у меня не получилось >> лимит времени вычисления 1-1,5 минуты на современном ПК >> >> если пожете подскажите
R>
R>int x = (1 << p) & ~((1 << n) - 1);
R>
UB
The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand.
R>Только вычисляется это выражение не 1-1.5 минуты, а наносекунды.
"_DAle_" <39698@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1838678@news.rsdn.ru... > R>" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1838620@news.rsdn.ru... >>> Мне нужно получить число возведением в степень >>> 2^p, где р порядка p=2^30 > UB >
> The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand.
>
Ух, не досмотрел, что 2^30 — это еще не результат, а только степень.
Сорри.
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Darkness, Вы писали:
D>Здравствуйте, <Аноним>, Вы писали:
D>по поводу возведения в степень, припоминаю вот такое a^b = exp(b*ln(a)) D>но чесно говоря, не думаю, что оно проканает с большими степенями
В степень возвести то не проблема с логарифмической сложностью, вот только числа очень большие и не совсем понятно, что за часть числа нужна автору вопроса.
"_DAle_" <39698@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1838780@news.rsdn.ru... > В степень возвести то не проблема с логарифмической сложностью, вот только числа очень большие и не совсем понятно, что за часть числа нужна автору вопроса.
Числа просто громадные, если оставить без внимания ту часть вопроса, в которой говорится про часть числа , то объем памяти, который необходим для записи результата в целочисленном виде — сотня с лишним Мегабайт! Хорошенькая цифирька
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
> Мне нужно получить число возведением в степень > 2^p, где р порядка p=2^30 > но мне нужно не все число а его часть от м-3 до м-р , где м задаеться
Правильно ли я понял, что нужен фрагмент десятичной записи числа 2^p
x = (2^p) div (10^d) mod (10^m)
где d — номер младшего искомого разряда, m — количество разрядов?
Posted via RSDN NNTP Server 2.0
Перекуём баги на фичи!
Re: Возведение в большие степени
От:
Аноним
Дата:
10.04.06 16:17
Оценка:
m — это всего разрядов числа
и нужно получить его десятичную часть между м-3 до м-р разрядом
можно и так если число представить как степени двойки
число = __ 2**0+__2**1+...+__2**х+...+__2**у+...+__2**п
то получить двоичное число которое образуеться между х-ой и у-ой стпенью двойки из __
уже понял что надо делать через разложение стпени в ряд, т.е методично ее понижать
( например бином ньютона) НО ПОКА НЕ ПОЛУЧАЕТЬСЯ
спасибо за уделенное время и ответы
кстати я только сейчас понял что запись такого числа будет занимать несколько сотен метров
Здравствуйте, <Аноним>, Вы писали:
А>m — это всего разрядов числа А>и нужно получить его десятичную часть между м-3 до м-р разрядом
Если m — это количество десятичных разрядов числа, то m-p будет меньше 0.
А>можно и так если число представить как степени двойки А>число = __ 2**0+__2**1+...+__2**х+...+__2**у+...+__2**п
А>то получить двоичное число которое образуеться между х-ой и у-ой стпенью двойки из __
Надо определиться, если надо часть двоичного числа, то там же одни нули. Так надо часть числа в десятичной записи или двоичной? Если в десятичной, то какие ограничения на x и y? Или они могут быть произвольные?
А>уже понял что надо делать через разложение стпени в ряд, т.е методично ее понижать А>( например бином ньютона) НО ПОКА НЕ ПОЛУЧАЕТЬСЯ
Казалось бы, при чем тут ряды и ньютон.
А>спасибо за уделенное время и ответы А>кстати я только сейчас понял что запись такого числа будет занимать несколько сотен метров
Пожалуйста, только лучше перед задаванием вопроса хорошенько подумать и нормально его сформулировать, тогда и получишь адекватный ответ.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: Возведение в большие степени
От:
Аноним
Дата:
10.04.06 17:20
Оценка:
нулей там нет возведите 2 в степень 2**30 и проверте
а с розрядом я описался не р а просто заданное число пусть К
" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1840778@news.rsdn.ru... > нулей там нет возведите 2 в степень 2**30 и проверте >...
Да откуда ж им взяться (я имею ввиду десятичную систему счисления), если в множителях разложения нет ниодной пятерки?
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
R>" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1840778@news.rsdn.ru... >> нулей там нет возведите 2 в степень 2**30 и проверте >>...
R>Да откуда ж им взяться (я имею ввиду десятичную систему счисления), если в множителях разложения нет ниодной пятерки?
" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1838620@news.rsdn.ru... > Мне нужно получить число возведением в степень > 2^p, где р порядка p=2^30 > но мне нужно не все число а его часть от м-3 до м-р , где м задаеться > > делаеться это представление числа как полином ньютона но у меня не получилось > лимит времени вычисления 1-1,5 минуты на современном ПК > > если пожете подскажите
Я не полностью уверен, что понял условие, но все же попытаюсь привести решение задачи в так, как я ее понял.
Итак выражение: x = 2^p, где p <= 2^31 необходимо представить в виде: x = v*10^N, где p и N — целые;
Решение в виде консольного приложения на С++:
#include <iostream>
#include <cmath>
#include <cassert>
//целочисленная степеньtypedef unsigned long Power;
//Тип для представления огромного числа в виде first * 10^secondtypedef std::pair<double, Power> HugeNumber;
//Функция представления числа вида x = 2^(2^n) 0 <= n < 32
//в виде: x = first * 10^second
HugeNumber huge_from_degree(Power n)
{
assert(0 <= n && n < 32);
//lg(2) - десятичный логарифм из 2.double log_10_of_2 = std::log(2.0)/std::log(10.0);
double p = Power(1) << n;
double ex = p * log_10_of_2; //x = 10^ex
Power ex_i = Power(ex); //целая часть от exdouble ex_f = ex - ex_i; //дробная часть от exdouble v = std::exp(ex_f * std::log(10.0)); //v = 10^ex_freturn HugeNumber(v,ex_i);
}
//Оператор вывода в поток для HugeNumber
std::ostream& operator<<(std::ostream& os, const HugeNumber& v)
{
return os << v.first << " * 10^" << v.second;
}
int main()
{
std::cout << "2^(2^0) = \t" << huge_from_degree(0) << std::endl;
std::cout << "2^(2^1) = \t" << huge_from_degree(1) << std::endl;
std::cout << "2^(2^2) = \t" << huge_from_degree(2) << std::endl;
std::cout << "2^(2^3) = \t" << huge_from_degree(3) << std::endl;
std::cout << "2^(2^4) = \t" << huge_from_degree(4) << std::endl;
std::cout << "2^(2^5) = \t" << huge_from_degree(5) << std::endl;
std::cout << "2^(2^30) = \t" << huge_from_degree(30) << std::endl;
}