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();
}
posted @ 2021-02-20 16:48  _dwt  阅读(66)  评论(0)    收藏  举报