Нахождение суммы k-ых степеней
+Как придумать формулу для суммы \(1^5 + 2^5 + 3^5 + \ldots + n^5\) и есть ли она вообще?
+ +diff --git a/archives.html b/archives.html index 39ecca2..9da6846 100644 --- a/archives.html +++ b/archives.html @@ -30,17 +30,19 @@
Как придумать формулу для суммы \(1^5 + 2^5 + 3^5 + \ldots + n^5\) и есть ли она вообще?
+ +Как придумать формулу для суммы \(1^5 + 2^5 + 3^5 + \ldots + n^5\) и есть ли она вообще?
+ +Как придумать формулу для суммы \(1^5 + 2^5 + 3^5 + \ldots + n^5\) и есть ли она вообще?
+ +Пусть мы получили набор таких разбиений, то есть набор пар вида \(\left( p, q \right)\). Давайте составим из них граф, где вершинки это простые числа, а ориентированное ребро из \(p\) в \(q\) означает, что есть пара \(\left( p, q \right)\). Из того, что порядок склеивания чисел произвольный сразу следует, что рассматриваемый граф должен быть неориентированным. Таким образом, все пары \(\left( p, q \right)\) для которых нет пары \(\left( q, p \right)\) необходимо выкинуть, а из оставшихся построить граф.
Теперь задача стало гораздо понятнее: достаточно выбрать клику размера 5, что сумма значений её вершин минимальна. В общем случае, это достаточно ресурсоёмкая(как мне кажется) задача, но в реальном графе количество рёбер не слишком большое. В худшем случае, по теореме Турана, количество рёбер в графе лишь с одной такой кликой примерно на 10% меньше числа рёбер в полном графе.
Непосредственно сам поиск такой клики можно реализовать тривиально. Ниже мой код на C++11 с использованием библиотеки Boost Graph Library (BGL).
-#include <iostream>
-#include <algorithm>
-#include <vector>
-#include <set>
-#include <map>
-#include <cstdint>
+#include <iostream>
+#include <algorithm>
+#include <vector>
+#include <set>
+#include <map>
+#include <cstdint>
-#include <boost/graph/adjacency_list.hpp>
-#include "primesieve.hpp"
+#include <boost/graph/adjacency_list.hpp>
+#include "primesieve.hpp"
using namespace std;
using namespace boost;
@@ -125,7 +125,7 @@
void delBadEdges(vector< pair<T,T> > &edges){
map< int64_t, int > mults; // contains counts of p * q
- for (auto p: edges) {
+ for (auto p: edges) {
int64_t key = p.first * p.second;
if ( mults.find(key) != mults.end() )
mults[key] += 1;
@@ -133,7 +133,7 @@
mults[key] = 1;
}
vector< pair<T,T> > res;
- for (auto p: edges) {
+ for (auto p: edges) {
int64_t key = p.first * p.second;
if ( mults[key] == 2 ){
res.push_back(p);
@@ -147,7 +147,7 @@
template <class T>
set<T> getUniqNums(vector< pair<T,T> > &edges){
set<T> res;
- for (auto p: edges) {
+ for (auto p: edges) {
res.insert(p.first);
res.insert(p.second);
}
@@ -163,7 +163,7 @@
for (auto e_it = edges.first; e_it != edges.second; ++e_it)
adj_verts.push_back(target(*e_it,g));
- for (auto prev_v: cur_set)
+ for (auto prev_v: cur_set)
if ( find(adj_verts.begin(), adj_verts.end(), prev_v) == adj_verts.end() )
return;
@@ -174,7 +174,7 @@
return;
}
- for (auto v: adj_verts){
+ for (auto v: adj_verts){
if ( (vert_prime.at(v) < vert_prime.at(st)) )
continue;
getNeedSet(g,v,depth - 1, cur_set, vert_prime, v_out);
@@ -191,7 +191,7 @@
v_primes.clear();
vector< pair< long,long > > all_edges;
- for (auto pr: s_primes){
+ for (auto pr: s_primes){
auto t_v = getPrimePairs(pr, s_primes);
copy(t_v.begin(),t_v.end(),back_inserter(all_edges));
}
@@ -203,13 +203,13 @@
map< Graph::vertex_descriptor, long > vert_prime;
map< long, Graph::vertex_descriptor > prime_vert;
Graph g;
- for (auto pr: s_primes){
+ for (auto pr: s_primes){
vert_prime[add_vertex(g)] = pr;
}
- for (auto v: vert_prime){
+ for (auto v: vert_prime){
prime_vert[v.second] = v.first;
}
- for (auto p: all_edges)
+ for (auto p: all_edges)
add_edge(prime_vert.at(p.first),prime_vert.at(p.second),g);
auto all_vertices = vertices(g);
vector< set<Graph::vertex_descriptor> > goods;
@@ -220,7 +220,7 @@
for (size_t i = 0; i < goods.size(); ++i){
cout << "Good set #" << i+1 << ": ";
size_t cur_sum = 0;
- for (auto el: goods[i]){
+ for (auto el: goods[i]){
el = vert_prime.at(el);
cur_sum += el;
cout << el << " ";
diff --git a/posts/nakhozhdenie-summy-k-ykh-stepenei/index.html b/posts/nakhozhdenie-summy-k-ykh-stepenei/index.html
new file mode 100644
index 0000000..8c66b36
--- /dev/null
+++ b/posts/nakhozhdenie-summy-k-ykh-stepenei/index.html
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+ Нахождение суммы k-ых степеней
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Блог 529
+ Project Euler и остальное
+
+
+
+
+
+ -
+
+
+
+ Нахождение суммы k-ых степеней
+
+
+
+ Давайте сразу обобщим задачу до нахождения \(f_k\left( n \right)\), что
$$f_k\left( n \right) = 1^k + 2^k + \ldots + n^k$$
+Для \(k=1\) формула известна всем школьникам: \(f_1\left( n \right) = \frac{n\left(n+1 \right)}{2}\). Формулу для \(k=2\) знают уже не все, но всё же в школе её найти можно (я видел на обложке учебника по алгебре): \(f_2\left( n \right) = \frac{n\left(n+1 \right) \left( 2n + 1 \right)}{6}\)
+Интуиция может подсказать, что \(f_k \left( n \right)\) есть некий полином со степенью \(k+1\). Если это так, то его нахождение тривиально. Например, можно посчитать его в явном виде, используя полином Лагагранжа.
+Осталось показать, что наша функция представима в таком виде.
+Для начала введём обозначение. “Нижней степенью”, \(x^{\underline{k}}\), будем обозначать такое выражение:
$$x^{\underline{k}} = x(x-1)\cdot \ldots \cdot (x-k+1)$$.
+Далее, заметим следующее, если \(a_i = A_{i+1} - A_i\), где \(\lbrace a_i \rbrace\) и \(\lbrace A_i \rbrace\) — некие последовательности, то \(\sum_{i=1}^n = A_{n+1}-A_1\) (телескопирование, можно посмотреть тут, с. 6).
+Теперь посчитаем сумму \(\sum_{i=1}^n i^{\underline{k}}\). Для этого достаточно понять, что \(\left( x+1 \right)^{\underline{k+1}} - \left(x \right)^{\underline{k+1}} = \left( k+ 1 \right)x^{\underline{k}}\). Отсюда сразу получаем, что
+
$$\sum_{i=1}^n i^{\underline{k}} = \frac{\left( n+1 \right)^{\underline{k+1}}}{k+1}$$
+
+Осталось показать, что “нормальные” степени выражаются через нижние. Начнём со степени \(k=1\), тут всё просто:
+
$$x = x^{\underline{1}}$$
+С бОльшими степенями сделаем следующее: считая, что все степени, меньше, чем \(k\) мы выражать умеем, раскроем скобки в определении нижней степени. Теперь поймём, что старший коэффициент \(1\): \(x^{\underline{k}} = x^k + \sum_{i=1}^k a_ix^i\) или \(x^k = \sum_{i=1}^k a_ix^i - x^{\underline{k}}\). Осталось понять, что каждое из слагаемых вида \(a_ix^i\) мы умеем выражать через нижние степени. Таким образом, можно получить следующее:
+$$ \sum_{i=1}^{n} i^k = \sum_{i=1}^{n} \sum_{j=1}^{k} a_j i^{\underline{k}} = \sum_{j=1}^{k} \sum_{i=1}^{n} a_j i^{\underline{k}} = \sum_{j=1}^{k} \frac{a_j \left(n+1 \right)^{\underline{k+1}}}{k+1}$$
+
+Кстати, формула для суммы в самом начале такая:
+
$$ \sum_{i=1}^n i^5 = \frac{1}{12} n^2 \left(n+1 \right)^2 \left(2n^2 + 2n-1 \right) $$
+
+
+
+
+
+
+
+
+
+
+ comments powered by Disqus
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/posts/wallabag-i-realnaia-zhizn/index.html b/posts/wallabag-i-realnaia-zhizn/index.html
index e39b493..3c2d8f7 100644
--- a/posts/wallabag-i-realnaia-zhizn/index.html
+++ b/posts/wallabag-i-realnaia-zhizn/index.html
@@ -55,7 +55,7 @@
Wallabag и реальная жизнь
diff --git a/tag/bgl.html b/tag/bgl.html
index d7c50b2..8da86ae 100644
--- a/tag/bgl.html
+++ b/tag/bgl.html
@@ -54,7 +54,7 @@
Моё решение задачи 60
diff --git a/tag/blog.html b/tag/blog.html
index 7bc4ab5..67e8473 100644
--- a/tag/blog.html
+++ b/tag/blog.html
@@ -54,7 +54,7 @@
Мой первый пост
diff --git a/tag/bot.html b/tag/bot.html
index 07e0789..e75eb24 100644
--- a/tag/bot.html
+++ b/tag/bot.html
@@ -54,7 +54,7 @@
Как я шахматного бота писал
diff --git a/tag/c.html b/tag/c.html
index 91c189c..9367411 100644
--- a/tag/c.html
+++ b/tag/c.html
@@ -54,7 +54,7 @@
CrossGen v1.0
@@ -68,7 +68,7 @@
Моё решение задачи 60
diff --git a/tag/go.html b/tag/go.html
index 3884295..4324756 100644
--- a/tag/go.html
+++ b/tag/go.html
@@ -54,7 +54,7 @@
Wallabag и реальная жизнь
diff --git a/tag/matematika.html b/tag/matematika.html
new file mode 100644
index 0000000..5eacd6d
--- /dev/null
+++ b/tag/matematika.html
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+ Блог 529 - математика
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Блог 529
+ Project Euler и остальное
+
+
+
+
+
+ -
+
+
+
+ Нахождение суммы k-ых степеней
+
+
+ Как придумать формулу для суммы \(1^5 + 2^5 + 3^5 + \ldots + n^5\) и есть ли она вообще?
+
+
+
+
+
+
+
+ Page 1 / 1
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tag/open-source.html b/tag/open-source.html
index f82e72e..1bc69d7 100644
--- a/tag/open-source.html
+++ b/tag/open-source.html
@@ -54,7 +54,7 @@
Wallabag и реальная жизнь
diff --git a/tag/proekt.html b/tag/proekt.html
index e12a555..9f0c51f 100644
--- a/tag/proekt.html
+++ b/tag/proekt.html
@@ -54,7 +54,7 @@
Как я шахматного бота писал
@@ -68,7 +68,7 @@
CrossGen v1.0
@@ -82,7 +82,7 @@
Ещё одно вычисление выражений
diff --git a/tag/project-euler.html b/tag/project-euler.html
index 97dc348..451c4fa 100644
--- a/tag/project-euler.html
+++ b/tag/project-euler.html
@@ -54,7 +54,7 @@
Моё решение задачи 60
diff --git a/tag/shakhmaty.html b/tag/shakhmaty.html
index b296a2a..4b2237f 100644
--- a/tag/shakhmaty.html
+++ b/tag/shakhmaty.html
@@ -54,7 +54,7 @@
Как я шахматного бота писал
diff --git a/tag/wallabag.html b/tag/wallabag.html
index 9472acf..b5e599e 100644
--- a/tag/wallabag.html
+++ b/tag/wallabag.html
@@ -54,7 +54,7 @@
Wallabag и реальная жизнь
diff --git a/tag/wxwidgets.html b/tag/wxwidgets.html
index e2a7943..22a6593 100644
--- a/tag/wxwidgets.html
+++ b/tag/wxwidgets.html
@@ -54,7 +54,7 @@
CrossGen v1.0
diff --git a/tags.html b/tags.html
index ad91d88..433d75b 100644
--- a/tags.html
+++ b/tags.html
@@ -32,6 +32,7 @@
- бот (1)
- c++ (2)
- Go (1)
+ - математика (1)
- open source (1)
- проект (3)
- Project Euler (1)