Возведение в большие степени
От: Аноним  
Дата: 09.04.06 08:19
Оценка:
Мне нужно получить число возведением в степень
2^p, где р порядка p=2^30
но мне нужно не все число а его часть от м-3 до м-р , где м задаеться

делаеться это представление числа как полином ньютона но у меня не получилось
лимит времени вычисления 1-1,5 минуты на современном ПК

если пожете подскажите
Re: Возведение в большие степени
От: rg45 СССР  
Дата: 09.04.06 10:18
Оценка:
" Аноним " <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
--
Справедливость выше закона. А человечность выше справедливости.
Re: Возведение в большие степени
От: _DAle_ Беларусь  
Дата: 09.04.06 10:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Мне нужно получить число возведением в степень

А>2^p, где р порядка p=2^30
А>но мне нужно не все число а его часть от м-3 до м-р , где м задаеться

Наверное, я еще не проснулся, но что означает выделенное?

А>делаеться это представление числа как полином ньютона но у меня не получилось

А>лимит времени вычисления 1-1,5 минуты на современном ПК

А>если пожете подскажите
Re[2]: Возведение в большие степени
От: _DAle_ Беларусь  
Дата: 09.04.06 10:25
Оценка:
Здравствуйте, rg45, Вы писали:


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 минуты, а наносекунды.
Re[3]: Возведение в большие степени
От: rg45 СССР  
Дата: 09.04.06 10:56
Оценка:
"_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
--
Справедливость выше закона. А человечность выше справедливости.
Re: Возведение в большие степени
От: Darkness Украина  
Дата: 09.04.06 13:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:

по поводу возведения в степень, припоминаю вот такое a^b = exp(b*ln(a))
но чесно говоря, не думаю, что оно проканает с большими степенями
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Возведение в большие степени
От: _DAle_ Беларусь  
Дата: 09.04.06 13:25
Оценка:
Здравствуйте, Darkness, Вы писали:

D>Здравствуйте, <Аноним>, Вы писали:


D>по поводу возведения в степень, припоминаю вот такое a^b = exp(b*ln(a))

D>но чесно говоря, не думаю, что оно проканает с большими степенями

В степень возвести то не проблема с логарифмической сложностью, вот только числа очень большие и не совсем понятно, что за часть числа нужна автору вопроса.
Re[3]: Возведение в большие степени
От: rg45 СССР  
Дата: 09.04.06 13:33
Оценка:
"_DAle_" <39698@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1838780@news.rsdn.ru...
> В степень возвести то не проблема с логарифмической сложностью, вот только числа очень большие и не совсем понятно, что за часть числа нужна автору вопроса.

Числа просто громадные, если оставить без внимания ту часть вопроса, в которой говорится про часть числа , то объем памяти, который необходим для записи результата в целочисленном виде — сотня с лишним Мегабайт! Хорошенькая цифирька
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re: Возведение в большие степени
От: Кодт Россия  
Дата: 09.04.06 21:22
Оценка:
> Мне нужно получить число возведением в степень
> 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**п

то получить двоичное число которое образуеться между х-ой и у-ой стпенью двойки из __


уже понял что надо делать через разложение стпени в ряд, т.е методично ее понижать
( например бином ньютона) НО ПОКА НЕ ПОЛУЧАЕТЬСЯ

спасибо за уделенное время и ответы
кстати я только сейчас понял что запись такого числа будет занимать несколько сотен метров
Re[2]: Возведение в большие степени
От: _DAle_ Беларусь  
Дата: 10.04.06 17:05
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>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 и проверте

а с розрядом я описался не р а просто заданное число пусть К
Re[4]: Возведение в большие степени
От: _DAle_ Беларусь  
Дата: 10.04.06 17:29
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>нулей там нет возведите 2 в степень 2**30 и проверте


2^30 в двоичной — это 1000000000000000000000000000000

А>а с розрядом я описался не р а просто заданное число пусть К


абсолютно произвольное?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[4]: Возведение в большие степени
От: rg45 СССР  
Дата: 10.04.06 18:03
Оценка:
" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1840778@news.rsdn.ru...
> нулей там нет возведите 2 в степень 2**30 и проверте
>...

Да откуда ж им взяться (я имею ввиду десятичную систему счисления), если в множителях разложения нет ниодной пятерки?
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Возведение в большие степени
От: _DAle_ Беларусь  
Дата: 10.04.06 18:14
Оценка:
Здравствуйте, rg45, Вы писали:


R>" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1840778@news.rsdn.ru...

>> нулей там нет возведите 2 в степень 2**30 и проверте
>>...

R>Да откуда ж им взяться (я имею ввиду десятичную систему счисления), если в множителях разложения нет ниодной пятерки?


2^10
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Возведение в большие степени
От: rg45 СССР  
Дата: 10.04.06 20:52
Оценка:
" Аноним " <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^second
typedef 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); //целая часть от ex
  double  ex_f = ex - ex_i;    //дробная часть от ex
  double  v =  std::exp(ex_f * std::log(10.0)); //v = 10^ex_f

  return 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;
}


Результаты выполнения:

2^(2^0) = 2 * 10^0
2^(2^1) = 4 * 10^0
2^(2^2) = 1.6 * 10^1
2^(2^3) = 2.56 * 10^2
2^(2^4) = 6.5536 * 10^4
2^(2^5) = 4.29497 * 10^9
2^(2^30) = 4.19716 * 10^323228496

Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.