Member 14549814 Ответов: 4

Мне нужна формула для этой штуки в описании


Проблема более сложная, но в конце концов это то, что я получил:
n*1^3+(n-1)*(2^3)+(н-2)*(3^3)+...+n^3
Мне нужна формула, потому что n может быть 500.000.000

Что я уже пробовал:

Из-за использования больших чисел выполнение вычисления один за другим превысит TLE

0x01AA

Мое чувство похоже на математику. Индукция может помочь здесь (создать формулу): Математическая индукция - Википедия[^]

Patrice T

Покажите свою работу

Patrice T

В этой формуле не так много вычислений, чтобы сэкономить.
Можете ли вы дать ссылку на полную проблему?

4 Ответов

Рейтинг:
2

k5054

Если вы используете Linux, то GMP-это, вероятно, правильный путь. Есть также инструкции по компиляции в windows, но для этого, похоже, требуется Cygwin[^], Unix-подобная среда для windows. Может быть, сегодня вы могли бы сделать это с WSL.

Если вы находитесь в ... Чистый мир, тогда предложение Рикзилана, вероятно, сработает для вас. В противном случае, взгляните сюда: Список программ для арифметики произвольной точности - Википедия[^] и посмотрите, соответствует ли какая-либо из библиотек вашим потребностям. Если вы собираетесь распространять готовый продукт, не забудьте убедиться, что лицензия на библиотеку совместима с вашими планами распространения.


Рейтинг:
1

Stefan_Lang

Сумма может быть выражена следующим образом

result = Sum{k=1..n} (n+1-i) * k^3
= (n+1) * Sum{k=1..n} k^3 - Sum{k=1..n} k^4

(Извините, я понятия не имею, как использовать символы mathematica в HTML)

Существуют замкнутые решения для двух сумм k^a для любого положительного интегрального числа a. Вы можете найти решение для суммы(k^3) и простой алгоритм для получения решения для суммы(k^4) в Сумма n, n2 или n3 | блестящая математика и наука Wiki[^]

Формула для k^3, предложенная прямо в верхней части этого веб-сайта, такова:
Sum{k=1..n} (k^3) = n^2*(n+1)^2 / 4

а сумма для k^4 дана в самом низу как:
Sum{k=1..n} (k^4) = n*(n+1)*(2*n+1)*(3*n^2+3*n-1) / 30

Теперь все, что вам нужно сделать, это вычислить оба, умножить первое на (n+1). и вычтите последнее.

P.S.: Вот небольшая программа, чтобы доказать, что формулы работают так, как задумано:
#include <iostream>

using namespace std;
double sum_of_power3(int n)
{
    double dn = (double)n;
    return dn*dn*(dn+1)*(dn+1)/4;
}
double sum_of_power4(int n)
{
    double dn = (double)n;
    return dn*(dn+1)*(2*dn+1)*(3*dn*dn+3*dn-1)/30;
}
int main()
{
    double sn3 = 0;
    double sn4 = 0;
    for (int n = 1; n < 5; ++n)
    {
        sn3 += n*n*n;
        sn4 += n*n*n*n;
        cout << "sum of " << n << "^3 " << sn3 << " " << sum_of_power3(n) << endl;
        cout << "sum of " << n << "^4 " << sn4 << " " << sum_of_power4(n) << endl;
    }

    return 0;
}
Выход:
sum of 1^3 1 1                                                                                                                               
sum of 1^4 1 1                                                                                                                               
sum of 2^3 9 9                                                                                                                               
sum of 2^4 17 17                                                                                                                             
sum of 3^3 36 36                                                                                                                             
sum of 3^4 98 98                                                                                                                             
sum of 4^3 100 100                                                                                                                           
sum of 4^4 354 354                                                                                                                           


Рейтинг:
1

Rick York

Использование значений с плавающей запятой :

calculating value for 500,000,000 : result was 1.563E+42 - time was 5.812 seconds
в режиме отладки на ноутбуке.
template< typename T > T Cube( T a )    // calculates the cube of a value
{
    return a * a * a;
}

double CalculateSeries( UINT64 size )
{
    double sum = 0;
    for( UINT64 n = 0; n < size; ++n )
       sum += ( size - n ) * Cube( (double)n + 1.0 );
    return sum;
}


Rick York

В режиме выпуска он занимает 0,634 секунды.

Рейтинг:
0

RickZeeland

Взгляните на эту статью CodeProject: Класс BigNumber, выполненный на языке C#[^]

Если вы используете C++, взгляните на: Библиотека вычислений с повышенной точностью [^]
А вот и неплохое видео: Как использовать библиотеки Boost C++ в Visual Studio - YouTube[^]