C/C++
Вычисление суммы знакопеременного ряда
Данa последовательность (-1)ⁿ p(n) / n, где р(n) - количество простых чисел от 1 до n включительно, а n последовательно проходит все натуральные значения. Чему равна сумма всех элементов этой последовательности?
Я бы так сделала (с ситом Эратосфена !):
#include <iostream>
#include <cmath>
using namespace std;
unsigned *a, b[32], c[32];
void fal(unsigned x) { a[x >> 5] &= c[x & 31]; }
unsigned bit(unsigned x)
{ return a[x >> 5] & b[x & 31]; }
int main() { unsigned i, j, k, l, m, n;
double z = 1, s = 0., p; i = 1; b[0] = i; c[0] = ~i;
for (j = 1; j < 32; j++) { i <<= 1; b[j] = i; c[j] = ~i; }
cout << "n = ?\b"; cin >> n; m = ceil((n + 1.) / 32);
a = new unsigned [m]; for (i = 0; i <= m; i++)
a[i] = 4294967295; fal(0); fal(1); i = ceil(sqrt(n));
for (j = 2; j <= i; j++) if (bit(j)) { k = n / j;
for (l = 2; l <= k; l++) fal(l * j); }
p = 0.; for (i = 1; i < n; i++) { z *= -1.;
if (bit(i)) p += 1.; s += z * p / i; } cout << s << ' ';
if (bit(n)) p += 1.; s += - z * p / n; cout << s
<< endl; system("pause > nul"); return 0; }
Тут информация о простоте или непростоте чисел в диапазоне [0; n] упаковывается в массив из четырёхбайтных целых типа unsigned. Сама же последовательность сумм S(n) состоит из двух подпоследовательностей - одна для чётных, другая для нечётных n. Это как Инь и Ян китайской натурфилософии, где Ян - ведущий элемент. Вот и здесь S(2n+1) получается точнее S(2n), которая постоянно догоняет сумму нечётных 2n+1, а сравняются они только в бесконечности. Точность всей суммы не меньше модуля первого отброшенного члена исходной последовательности, так как ряд этот знакопеременный. Только вот ошибка получается достаточно значительной в силу плохой сходимости ряда, модуль общего члена которого ~¹/ln n. У меня получились следующие результаты, когда я взяла n=2³²-1:
S(4294967294) = -1,14885
S(4294967295) = -1,19618
Значение последней суммы - более точное, а относительная ошибка лежит в пределах примерно ±3,76%. Если надо относительную ошибку уменьшить хотя бы до 3%, тогда надо перебрать что-то около триллиона первых натуральных чисел. Интересно вот только - да кому это нужно? Для простой оценки сойдёт и этот полученный результат, тем более, что от таких вычислений всё равно никому нет никакой пользы!. (◔‿◔)
#include <iostream>
#include <cmath>
using namespace std;
unsigned *a, b[32], c[32];
void fal(unsigned x) { a[x >> 5] &= c[x & 31]; }
unsigned bit(unsigned x)
{ return a[x >> 5] & b[x & 31]; }
int main() { unsigned i, j, k, l, m, n;
double z = 1, s = 0., p; i = 1; b[0] = i; c[0] = ~i;
for (j = 1; j < 32; j++) { i <<= 1; b[j] = i; c[j] = ~i; }
cout << "n = ?\b"; cin >> n; m = ceil((n + 1.) / 32);
a = new unsigned [m]; for (i = 0; i <= m; i++)
a[i] = 4294967295; fal(0); fal(1); i = ceil(sqrt(n));
for (j = 2; j <= i; j++) if (bit(j)) { k = n / j;
for (l = 2; l <= k; l++) fal(l * j); }
p = 0.; for (i = 1; i < n; i++) { z *= -1.;
if (bit(i)) p += 1.; s += z * p / i; } cout << s << ' ';
if (bit(n)) p += 1.; s += - z * p / n; cout << s
<< endl; system("pause > nul"); return 0; }
Тут информация о простоте или непростоте чисел в диапазоне [0; n] упаковывается в массив из четырёхбайтных целых типа unsigned. Сама же последовательность сумм S(n) состоит из двух подпоследовательностей - одна для чётных, другая для нечётных n. Это как Инь и Ян китайской натурфилософии, где Ян - ведущий элемент. Вот и здесь S(2n+1) получается точнее S(2n), которая постоянно догоняет сумму нечётных 2n+1, а сравняются они только в бесконечности. Точность всей суммы не меньше модуля первого отброшенного члена исходной последовательности, так как ряд этот знакопеременный. Только вот ошибка получается достаточно значительной в силу плохой сходимости ряда, модуль общего члена которого ~¹/ln n. У меня получились следующие результаты, когда я взяла n=2³²-1:
S(4294967294) = -1,14885
S(4294967295) = -1,19618
Значение последней суммы - более точное, а относительная ошибка лежит в пределах примерно ±3,76%. Если надо относительную ошибку уменьшить хотя бы до 3%, тогда надо перебрать что-то около триллиона первых натуральных чисел. Интересно вот только - да кому это нужно? Для простой оценки сойдёт и этот полученный результат, тем более, что от таких вычислений всё равно никому нет никакой пользы!. (◔‿◔)
Поскольку количество простых чисел по сравнению с общим их количеством относительно невелико, данная сумма должна конвергировать к некоторому -σln2. Осталось найти асимптотику этого σ, но тут уж извиняй, теоретический математик из меня так себе... А при чем тут программирование?
Сергей Каратаев
У меня минусовой результат и получается, а причем тут -сигма ln2 и откуда вообще взялось такое диковинное выражение? Я и в прошлый раз не поняла насчет мажорирующего ряда, и сейчас снова не понимаю такого странного ответа. Вычислить же надо значение суммы ряда, а для этого требуется разыскать все простые числа. Я на пальцах буду все это считать или пусть лучше компьютер за меня посчитает по программе? Асимптотики еще надо уметь правильно определять, а тут просто надо вычислить сумму и желательно с приемлемой точностью, что еще непонятно? Это задания по модулю ‹‹итерационные и рекурсивные алгоритмы››, кстати говоря.
взять и посчитать в лоб
primes 2 to 100 000 000
считаются за
7.98999890685081E-0001 секунд
primes 2 to 100 000 000
считаются за
7.98999890685081E-0001 секунд
Программа "Боевая Ударница"=на Фортран, развивает логику.
Умничка, и Любимка тоже.
Лапа, лапуся тоже.
Удач!!!!!
Умничка, и Любимка тоже.
Лапа, лапуся тоже.
Удач!!!!!
Помогите !Как сделать меню в small basic? !
Надо что бы в меню было кнопка играть (при нажатие которой стирается все что есть на данный момент на экране и появляется квадрат который спомошью мышки можно управлять),сохранит(при нажатии которой сохраняется игра на том моменте где остановилась),настройки(при нажатии которой стирается все что есть на данный момент на экране и появляется кнопка которая делает окно во весь игран),выход(при нажатии которой выходит из программы)
!!П.с кнопка Esc должна в каждой из выше перечислено возвращаться к меню!!
Кнопка Еsc должна быть
Надо что бы в меню было кнопка играть (при нажатие которой стирается все что есть на данный момент на экране и появляется квадрат который спомошью мышки можно управлять),сохранит(при нажатии которой сохраняется игра на том моменте где остановилась),настройки(при нажатии которой стирается все что есть на данный момент на экране и появляется кнопка которая делает окно во весь игран),выход(при нажатии которой выходит из программы)
!!П.с кнопка Esc должна в каждой из выше перечислено возвращаться к меню!!
Кнопка Еsc должна быть
Похожие вопросы
- Писать код функции S(x) вычисления сумму ряда с заданной точностей
- Составьте алгоритм и напишите программу вычисления суммы n членов ряда согласно условию задачи
- Вычислить сумму бесконечного ряда c точностью e=0.0001
- Задача . Знакопеременная сумма
- Вычислить сумму ряда c++
- Помогите составить алгоритм вычисления функции:
- Погрешности вычислений. Вычисление значений функций
- Найти сумму и произведения элементов ряда
- Leetcode. 2221. Треугольная сумма массива. Казалось бы, при чём здесь Паскаль?
- С++ вычисление последовательностей
А в той другой задаче про ряды регулярность наступает где-то при четверти или трети триллиона и выше. Потом там тоже переделаю числа на 16-байтные, сделаю надёжные функции, которым можно доверять, и буду запускать по новой. И еще на подходе куча новых задач, то есть я пока в запарке, а Вам всего хорошего!
поскольку члены ряда с разными знаками, при начале с больших когда доходим до маленьких, накапливается ошибка
для повышения точности надо суммировать нечиная с маленьких пар. тогда результат получится существенно точнее.
у меня
за 7.98999890685081E-0001 секунд найдено
primes 2 to 100 000 000