Farey Sequence
n阶\(Farey Sequence\)是 [0,1]间 分母不超过n的有理数的升序排列.
相关数学证明:
\(\frac{m}{n}<\frac{m+m'}{n+n'}<\frac{m'}{n'}\)
初始, 令\(\frac{0}{1} = \frac{m}{n}\), \(\frac{1}{1} = \frac{m'}{n'}\)
假设任意有理数\(\frac{a}{b}, 满足:\frac{m}{n}<\frac{a}{b}<\frac{m'}{n'}\)
若 \(\frac{a}{b}=\frac{m+m'}{n+n'}\), 结束
若 \(\frac{a}{b}<\frac{m+m'}{n+n'}\), 令\(m'\leftarrow m+m', n'\leftarrow n+n'\)
若 \(\frac{a}{b}>\frac{m+m'}{n+n'}\), 令\(m\leftarrow m+m', n\leftarrow n+n'\)
则 \(an-bm\geqslant 1\),且\(bm'-an'\geqslant 1\)
\((an-bm)(m'+n')+(bm'-an')(m+n)\geqslant m+n+m'+n'\) \(\tag{1}\)
由于\(m'n-n'm=1 \tag{2}\),
这对于\(n(m+m')-m(n+n')=1\)与\(m'(n+n')-n'(m+m')=1\)自然成立.
由Bezout知互素.
\(a+b\geqslant m+n+m'+n'\), 有限步之内可以表示\(\frac{a}{b}\).
语无伦次(
参考Concrete4.5节
给出一种\(O(N^2)\)一种生成的方法:链表实现, 每轮次插入mediant, 共插入N-1次.
#include<cstdio>
struct Node {
int n, d;
Node* next;
};
Node* L = new Node;
Node* R = new Node;
void creat(const int& N) {
L->n = 0, L->d = 1;
R->n = 1, R->d = 1;
L->next = R;
R->next = NULL;
int _N = N;
while (--_N) {
Node* tail = L;
while (tail->next) {
if (tail->d + tail->next->d <= N) {
Node* p = new Node;
p->next = tail->next;
tail->next = p;
p->d = tail->d + p->next->d;
p->n = tail->n + p->next->n;
}
tail = tail->next;
}
}
}
void print() {
Node* t = L;
while (t) {
printf("%d/%d\n", t->n, t->d);
t = t->next;
}
}
int main() {
int n;
scanf("%d", &n);
creat(n);
print();
}