acm-基础数论学习笔记(下)

本文承接上文acm-基础数论学习笔记(上),并且正在更新中。

数论:

  • 九、特殊问题
    • 1.约瑟夫环
      • (1).问题引入
      • (2).暴力解法
      • (3).递推解法
      • (4).递推优化
    • 2.斐波拉契数列
      • (1).定义
      • (2).性质
    • 3.佩尔方程
      • (1).定义
      • (2).性质
      • (3).求解方法
        • [1].暴力法
        • [2].连分数法
          • <1>.连分数介绍
          • <2>.应用连分数求解佩尔方程
      • (4).习题
    • 4.类欧几里得算法
      • (1).定义
      • (2).f函数求解
      • (3).h函数求解
      • (4).g函数求解
      • (5).模板总结
      • (6).习题
  • 十、数论函数
    • 1.整除分块
      • (1).引理
      • (2).分块
    • 2.积性函数
      • (1).定义
      • (2).性质
      • (3).常见积性函数
      • (4).线性筛预处理积性函数
        • [1].莫比乌斯函数 μ ( n ) \mathbf{\mu(n)} μ(n)
        • [2].约数个数函数 d ( n ) \mathbf{d(n)} d(n)
        • [3].约数和函数 σ ( n ) \mathbf{\sigma(n)} σ(n)
    • 3.狄利克雷卷积
      • (1).定义
      • (2).性质
      • (3).常用卷积转化关系
    • 4.莫比乌斯反演定理
      • (1).基本内容
      • (2).证明
      • (3).习题
    • 5.特殊筛法
      • (1).杜教筛
        • [1].原理介绍
        • [2].习题
      • (2).min_25筛
        • [1].原理介绍
        • [2].习题
      • (3).洲阁筛
    • 6.推式子综合技巧
  • 总结

九、特殊问题

1.约瑟夫环

(1).问题引入

n个人围成一圈,从第一个人开始报数,数到k的人出列,再由下一个人重新从1开始报数,数到k的人再出圈,依次类推,直到所有的人都出圈,问最后出圈的一个人的编号是多少。

以上是这个问题的大致形式,除了问最后出圈的一个人的编号以外还可以问每次出圈的人的编号是多少。后面主要讨论如何快速确定最后一个出圈的人的编号。

(2).暴力解法

首先考虑最暴力的暴力做法,模拟整个报数的流程,对于当前的人如果已经报过数了就跳过,没报过数就让他报数并且让计数器加一,直到计数器变成k的时候给当前的人打个标记然后归零,直到只剩下一个人未被标记,这个人的编号就是最终的答案。

但上面的写法复杂度达到了下界 O ( n k ) \mathbf{O(nk)} O(nk),考虑如何稍微优化一下,注意到那些被打了标记的人会被重复考虑,这是因为我们没有把它们剔除数组,因为数组元素移动是 O ( n ) \mathbf{O(n)} O(n)的,剔除人就需要移动数组元素,故不合算。考虑适合剔除元素的数据结构,容易想到链表,我们用循环链表模拟这个圈,一旦有人报数为k的时候就把这个人对应的元素从链表中删除即可,这样就避免了报过数的人被重复考虑的冗余过程。

注意到上述两种做法虽然第二种更优秀,但复杂度是相同的,都是 O ( n k ) \mathbf{O(nk)} O(nk),故两者在本质上没有太多区别,不过当问题要求输出每次剔除的人的编号的时候链表模拟也是不错的选择。

(3).递推解法

我们先给位置从0开始标号(方便计算),然后设 f ( n ) \mathbf{f(n)} f(n) n \mathbf{n} n个人的时候的答案,那么有 f ( n ) = ( f ( n − 1 ) + k ) % n \mathbf{f(n)=(f(n-1)+k)\%n} f(n)=(f(n1)+k)%n
如何证明这一结论呢?我们采用映射的办法证明它。
首先最初的时候序列的分布如下所示(蓝色代表即将开始报数的位置):

位置 0 1 2 3 4 c-1 c c+1 n-1
编号 0 1 2 3 4 c-1 c c+1 n-1

然后我们从位置0开始往后数k个人,把第k个人给标记,显然往后数第k个人对应的编号为 ( k − 1 ) % n \mathbf{(k-1)\%n} (k1)%n,不妨设 c = ( k − 1 ) % n \mathbf{c=(k-1)\%n} c=(k1)%n,我们给编号c打上标记,于是序列分布变成下面的样子(标记成红色代表被踢出圈,蓝色代表即将报数的位置):

位置 0 1 2 3 4 c-1 c c+1 n-1
编号 0 1 2 3 4 c-1 c c+1 n-1

现在 c \mathbf{c} c已经被踢出了,并且我们即将从新的起点 c + 1 \mathbf{c+1} c+1开始报数,不妨从 c + 1 \mathbf{c+1} c+1位置开始给所有人安排一个新的编号,即把当前编号映射成新的编号。然后我们对现在的编号做一下映射得到下面的序列:

位置 0 1 2 3 4 c-1 c c+1 c+2 n-1
原编号 0 1 2 3 4 c-1 c c+1 c+2 n-1
映射编号 n-c-1 n-c n-c+1 n-c+2 n-c+3 n-2 - 0 1 n-c-2

根据表格容易发现映射编号与原编号的关系,设 s \mathbf{s} s为原编号, s ′ \mathbf{s'} s为新编号,则满足: s = { s ′ + c + 1 , if  s ′ ∈ [ 0 , n − c − 2 ] s ′ + c + 1 − n , if  s ′ ∈ [ n − c − 1 , n − 2 ] \mathbf{s = \begin{cases} s'+c+1, & \text{if }s'\in[0,n-c-2] \\ s'+c+1-n, & \text{if }s'\in[n-c-1,n-2] \end{cases}} s={s+c+1,s+c+1n,if s[0,nc2]if s[nc1,n2]
注意到 s ∈ [ 0 , n ) \mathbf{s\in[0,n)} s[0,n),又 ( c + 1 ) ≡ ( c + 1 − n ) ( m o d n ) \mathbf{(c+1)\equiv (c+1-n)\pmod n} (c+1)(c+1n)(modn),故我们其实可以将映射式改写为 s = ( s ′ + c + 1 ) % n \mathbf{s=(s'+c+1)\%n} s=(s+c+1)%n,这样就统一多了。然后注意到从映射编号对应的0开始报数,最终的映射编号下的答案其实就是 f ( n − 1 ) \mathbf{f(n-1)} f(n1),然后我们又有了映射函数,直接映射回去就能得到在序列中的原编号了,也就是 f ( n ) = ( f ( n − 1 ) + c + 1 ) % n \mathbf{f(n)=(f(n-1)+c+1)\%n} f(n)=(f(n1)+c+1)%n,由于 c = ( k − 1 ) % n \mathbf{c=(k-1)\%n} c=(k1)%n,我们带进去简化一下得到 f ( n ) = ( f ( n − 1 ) + ( k − 1 ) % n + 1 ) % n = ( f ( n − 1 ) + k ) % n \mathbf{f(n)=(f(n-1)+(k-1)\%n+1)\%n=(f(n-1)+k)\%n} f(n)=(f(n1)+(k1)%n+1)%n=(f(n1)+k)%n,这也是我们最终要证明的结论。

此外显然有 f ( 1 ) = 0 \mathbf{f(1)=0} f(1)=0,综合一下我们就得到了这个简单的公式:
f ( n ) = { 0 , if  n = 1 ( f ( n − 1 ) + k ) % n , if  n > 1 \mathbf{f(n) = \begin{cases} 0, & \text{if }n=1 \\ (f(n-1)+k)\%n, & \text{if }n>1 \end{cases}} f(n)={0,(f(n1)+k)%n,if n=1if n>1
于是我们就能做到 O ( n ) \mathbf{O(n)} O(n)递推了。

(4).递推优化

在前面递推地基础上进行简单的推广我们可以得到更优秀的方法。
还是考虑同样的分布:

位置 0 1 2 3 4 c-1 c c+1 n-1
编号 0 1 2 3 4 c-1 c c+1 n-1

刚才我们是k步k步往前报数,这次我们不妨加速这一进程,假设 k < n \mathbf{kk<n,我们直接走 ⌊ n k ⌋ \mathbf{\lfloor \frac nk\rfloor} kn k \mathbf{k} k步,这样能够一次性剔除 ⌊ n k ⌋ \mathbf{\lfloor \frac nk\rfloor} kn个人,于是就能得到如下表所示的分布(令 t = ⌊ n k ⌋ \mathbf{t=\lfloor \frac nk\rfloor} t=kn)。

位置 0 1 2 3 k-1 k 2k-1 2k tk-1 tk n-1
编号 0 1 2 3 k-1 k 2k-1 2k tk-1 tk n-1

我们还是从蓝色的编号开始以它为新起点重新给这些人编号,得到的映射结果如下表所示:

位置 0 1 2 3 k-1 k 2k-1 2k tk-2 tk-1 tk tk+1 n-1
原编号 0 1 2 3 k-1 k 2k-1 2k tk-2 tk-1 tk tk+1 n-1
映射编号 n-tk n-tk+1 n-tk+2 n-tk+3 - n-tk+k-1 - n-tk+2k-2 n-t-1 - 0 1 n-1-tk

根据上面的表格很容易找到映射编号 s ′ \mathbf{s'} s与原编号 s \mathbf{s} s关系: s = { s ′ + t k , if  s ′ ∈ [ 0 , n − 1 − t k ] s ′ + t k + ⌊ s ′ − ( n − t k ) k − 1 ⌋ − n , if  s ′ ∈ [ n − t k , n − t − 1 ] \mathbf{s = \begin{cases} s'+tk, & \text{if }s'\in[0,n-1-tk] \\ s'+tk+\lfloor \frac{s'-(n-tk)}{k-1}\rfloor-n, & \text{if }s'\in[n-tk,n-t-1] \end{cases}} s={s+tk,s+tk+k1s(ntk)n,if s[0,n1tk]if s[ntk,nt1]
当然你也可以让这个式子对n取模,不影响结果。利用这个映射关系我们就容易得到 f ( n ) \mathbf{f(n)} f(n)的具体表达式,又因为 f ( 1 ) = 0 \mathbf{f(1)=0} f(1)=0,此外注意到 n − t k = n % k \mathbf{n-tk=n\%k} ntk=n%k,故我们有: f ( n ) = { 0 , if  n = 1 ( f ( n − ⌊ n k ⌋ ) + ⌊ n k ⌋ k ) % n , if  n > 1 且 f ( n − ⌊ n k ⌋ ) ≤ n % k − 1 ( f ( n − ⌊ n k ⌋ ) + ⌊ f ( n − ⌊ n k ⌋ ) − n % k k − 1 ⌋ − n % k ) % n if  n > 1 且 f ( n − ⌊ n k ⌋ ) ≥ n % k \mathbf{f(n) = \begin{cases} 0, & \text{if }n=1 \\ (f(n-\lfloor \frac{n}{k}\rfloor)+\lfloor \frac{n}{k}\rfloor k)\%n, & \text{if }n>1 \text{且}f(n-\lfloor \frac{n}{k}\rfloor)\le n\%k-1\\ (f(n-\lfloor \frac{n}{k}\rfloor)+\lfloor \frac{f(n-\lfloor \frac{n}{k}\rfloor)-n\%k}{k-1}\rfloor -n\%k)\%n& \text{if }n>1 \text{且}f(n-\lfloor \frac{n}{k}\rfloor)\ge n\%k \end{cases}} f(n)=0,(f(nkn)+knk)%n,(f(nkn)+k1f(nkn)n%kn%k)%nif n=1if n>1f(nkn)n%k1if n>1f(nkn)n%k
注意该公式只适用于 k < n \mathbf{kk<n的时候,对于k大于等于n的情况我们只能套用前一个递推公式,当然为了美观你也可以写出一个综合的递推式出来:
f k ( n ) = { 0 , if  n = 1 { ( f ( n − ⌊ n k ⌋ ) + ⌊ n k ⌋ k ) % n , if  n > 1 且 f ( n − ⌊ n k ⌋ ) ≤ n % k − 1 ( f ( n − ⌊ n k ⌋ ) + ⌊ f ( n − ⌊ n k ⌋ ) − n % k k − 1 ⌋ − n % k ) % n if  n > 1 且 f ( n − ⌊ n k ⌋ ) ≥ n % k if  k < n { ( f ( n − 1 ) + k ) % n if  n > 1 if  k ≥ n \mathbf{f_k(n) = \begin{cases} 0, & \text{if }n=1 \\ \begin{cases} (f(n-\lfloor \frac{n}{k}\rfloor)+\lfloor \frac{n}{k}\rfloor k)\%n, & \text{if }n>1 \text{且}f(n-\lfloor \frac{n}{k}\rfloor)\le n\%k-1\\ (f(n-\lfloor \frac{n}{k}\rfloor)+\lfloor \frac{f(n-\lfloor \frac{n}{k}\rfloor)-n\%k}{k-1}\rfloor -n\%k)\%n& \text{if }n>1 \text{且}f(n-\lfloor \frac{n}{k}\rfloor)\ge n\%k \end{cases} & \text{if } k1 \end{cases}& \text{if }k\ge n \end{cases}} fk(n)=0,{(f(nkn)+knk)%n,(f(nkn)+k1f(nkn)n%kn%k)%nif n>1f(nkn)n%k1if n>1f(nkn)n%k{(f(n1)+k)%nif n>1if n=1if k<nif kn

复杂度的话,在 k < n \mathbf{kk<n的时候可以认为每次递推将 n − n k \mathbf{n-\frac nk} nkn变成 n \mathbf{n} n,也就是乘了个 k k − 1 \mathbf{\frac {k}{k-1}} k1k,那么复杂度近似为 l o g k k − 1 n \mathbf{log_{\frac {k}{k-1}}{n}} logk1kn;在 k ≥ n \mathbf{k\ge n} kn的时候复杂度为 O ( n ) \mathbf{O(n)} O(n)。可以发现当k特别小的时候这个算法会非常优秀。

2.斐波拉契数列

(1).定义

斐波拉契数列满足如下递推式
f ( n ) = { 0 , if  n = 0 1 , if  n = 1 f ( n − 1 ) + f ( n − 2 ) , if  n ≥ 2 \mathbf{f(n)=\begin{cases} 0,&\text{if }n=0\\ 1,&\text{if }n=1\\ f(n-1)+f(n-2),&\text{if }n\ge 2 \end{cases}} f(n)=0,1,f(n1)+f(n2),if n=0if n=1if n2
求解这个数列可以直接递推着求,利用递归写法即可。
不过如果n很大的话就需要用到矩阵快速幂,不明白的可以去网上其它地方查阅资料。

(2).性质

  1. f ( n ) = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] \mathbf{f(n)=\frac{1}{\sqrt 5}[(\frac{1+\sqrt 5}{2})^n-(\frac{1-\sqrt 5}{2})^n]} f(n)=5 1[(21+5 )n(215 )n]
    证明:这个证明非常神奇,我们可以发现存在 a ∈ R \mathbf{a\in R} aR使得 g ( n ) = f ( n ) − a f ( n − 1 ) \mathbf{g(n)=f(n)-af(n-1)} g(n)=f(n)af(n1)成为一个等比数列,然后就证明完毕了…可能有点懵,这里详细解释一下,我们尝试着找到这个 a \mathbf{a} a,不妨设 g ( n ) = b g ( n − 1 ) \mathbf{g(n)=bg(n-1)} g(n)=bg(n1),展开有 f ( n ) − a f ( n − 1 ) = b f ( n − 1 ) − b a f ( n − 2 ) \mathbf{f(n)-af(n-1)=bf(n-1)-baf(n-2)} f(n)af(n1)=bf(n1)baf(n2),移项得到 f ( n ) = ( a + b ) f ( n − 1 ) − b a f ( n − 2 ) \mathbf{f(n)=(a+b)f(n-1)-baf(n-2)} f(n)=(a+b)f(n1)baf(n2),又根据定义有 f ( n ) = f ( n − 1 ) + f ( n − 2 ) \mathbf{f(n)=f(n-1)+f(n-2)} f(n)=f(n1)+f(n2),于是能够得到 a + b = 1 , a b = − 1 \mathbf{a+b=1,ab=-1} a+b=1,ab=1,解方程容易发现解为 1 ± 5 2 \mathbf{\frac{1\pm \sqrt 5}{2}} 21±5 (因此有两组解),又因为 g ( 1 ) = f ( 1 ) − f ( 0 ) = 1 \mathbf{g(1)=f(1)-f(0)=1} g(1)=f(1)f(0)=1,知道首项和公比,那么就是常规等比数列的通项求解了,容易得到 g ( n ) = b n − 1 ⇒ f ( n ) = b n − 1 + a f ( n − 1 ) \mathbf{g(n)=b^{n-1}\Rightarrow f(n)=b^{n-1}+af(n-1)} g(n)=bn1f(n)=bn1+af(n1),将两组解代入这个式子得到:
    f ( n ) = ( 1 − 5 2 ) n − 1 + ( 1 + 5 2 ) f ( n − 1 ) \mathbf{f(n)={(\frac{1-\sqrt 5}{2})}^{n-1}+(\frac{1+\sqrt 5}2)f(n-1)} f(n)=(215 )n1+(21+5 )f(n1)
    f ( n ) = ( 1 + 5 2 ) n − 1 + ( 1 − 5 2 ) f ( n − 1 ) \mathbf{f(n)={(\frac{1+\sqrt 5}{2})}^{n-1}+(\frac{1-\sqrt 5}2)f(n-1)} f(n)=(21+5 )n1+(215 )f(n1)
    f ( n ) 与 f ( n − 1 ) \mathbf{f(n)与f(n-1)} f(n)f(n1)看做未知数,这就成了一个二元一次方程问题,解一下就能得到 f ( n ) = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] \mathbf{f(n)=\frac{1}{\sqrt 5}[(\frac{1+\sqrt 5}{2})^n-(\frac{1-\sqrt 5}{2})^n]} f(n)=5 1[(21+5 )n(215 )n]

  2. f ( 1 ) + f ( 2 ) + . . . + f ( n ) = f ( n + 2 ) − 1 \mathbf{f(1)+f(2)+...+f(n)=f(n+2)-1} f(1)+f(2)+...+f(n)=f(n+2)1
    证明: f ( 1 ) = f ( 3 ) − f ( 2 ) \mathbf{f(1)=f(3)-f(2)} f(1)=f(3)f(2)
    f ( 2 ) = f ( 4 ) − f ( 3 ) \mathbf{f(2)=f(4)-f(3)} f(2)=f(4)f(3)
    f ( 3 ) = f ( 5 ) − f ( 4 ) \mathbf{f(3)=f(5)-f(4)} f(3)=f(5)f(4)

    f ( n ) = f ( n + 2 ) − f ( n − 1 ) \mathbf{f(n)=f(n+2)-f(n-1)} f(n)=f(n+2)f(n1)
    将式子全部加起来得到 ∑ i = 1 n f ( i ) = f ( n + 2 ) − f ( 2 ) = f ( n + 2 ) − 1 \mathbf{\sum_{i=1}^{n}f(i)=f(n+2)-f(2)=f(n+2)-1} i=1nf(i)=f(n+2)f(2)=f(n+2)1

  3. f ( 1 ) 2 + f ( 2 ) 2 + . . . + f ( n ) 2 = f ( n ) f ( n + 1 ) \mathbf{f(1)^2+f(2)^2+...+f(n)^2=f(n)f(n+1)} f(1)2+f(2)2+...+f(n)2=f(n)f(n+1)
    证明:首先得到 f ( 1 ) 2 + f ( 2 ) 2 = 1 + 1 = 2 = f ( 2 ) f ( 3 ) \mathbf{f(1)^2+f(2)^2=1+1=2=f(2)f(3)} f(1)2+f(2)2=1+1=2=f(2)f(3),然后我们就可以列出如下式子:
    ( f ( 1 ) 2 + f ( 2 ) 2 ) + f ( 3 ) 2 = f ( 2 ) f ( 3 ) + f ( 3 ) 2 = f ( 3 ) [ f ( 2 ) + f ( 3 ) ] = f ( 3 ) f ( 4 ) \mathbf{(f(1)^2+f(2)^2)+f(3)^2=f(2)f(3)+f(3)^2=f(3)[f(2)+f(3)]=f(3)f(4)} (f(1)2+f(2)2)+f(3)2=f(2)f(3)+f(3)2=f(3)[f(2)+f(3)]=f(3)f(4)
    ( f ( 1 ) 2 + f ( 2 ) 2 + f ( 3 ) 2 ) + f ( 4 ) 2 = f ( 3 ) f ( 4 ) + f ( 4 ) 2 = f ( 4 ) [ f ( 3 ) + f ( 4 ) ] = f ( 4 ) f ( 5 ) \mathbf{(f(1)^2+f(2)^2+f(3)^2)+f(4)^2=f(3)f(4)+f(4)^2=f(4)[f(3)+f(4)]=f(4)f(5)} (f(1)2+f(2)2+f(3)2)+f(4)2=f(3)f(4)+f(4)2=f(4)[f(3)+f(4)]=f(4)f(5)

    f ( 1 ) 2 + f ( 2 ) 2 + . . . + f ( n ) 2 = f ( n ) f ( n + 1 ) \mathbf{f(1)^2+f(2)^2+...+f(n)^2=f(n)f(n+1)} f(1)2+f(2)2+...+f(n)2=f(n)f(n+1)
    证毕。

  4. f ( 1 ) + f ( 3 ) + f ( 5 ) + . . . + f ( 2 n − 1 ) = f ( 2 n ) \mathbf{f(1)+f(3)+f(5)+...+f(2n-1)=f(2n)} f(1)+f(3)+f(5)+...+f(2n1)=f(2n)
    证明:像性质2的证明过程一样展开即可。
    f ( 1 ) = f ( 2 ) − f ( 0 ) \mathbf{f(1)=f(2)-f(0)} f(1)=f(2)f(0)
    f ( 3 ) = f ( 4 ) − f ( 2 ) \mathbf{f(3)=f(4)-f(2)} f(3)=f(4)f(2)

    f ( 2 n − 1 ) = f ( 2 n ) − f ( 2 n − 2 ) \mathbf{f(2n-1)=f(2n)-f(2n-2)} f(2n1)=f(2n)f(2n2)
    将式子全部加起来得到 ∑ i = 1 n f ( 2 i − 1 ) = f ( 2 n ) − f ( 0 ) = f ( 2 n ) \mathbf{\sum_{i=1}^nf(2i-1)=f(2n)-f(0)=f(2n)} i=1nf(2i1)=f(2n)f(0)=f(2n)

  5. f ( 2 ) + f ( 4 ) + f ( 6 ) + . . . + f ( 2 n ) = f ( 2 n + 1 ) − 1 \mathbf{f(2)+f(4)+f(6)+...+f(2n)=f(2n+1)-1} f(2)+f(4)+f(6)+...+f(2n)=f(2n+1)1
    证明:跟性质4证明过程几乎完全一样。
    f ( 2 ) = f ( 3 ) − f ( 1 ) \mathbf{f(2)=f(3)-f(1)} f(2)=f(3)f(1)
    f ( 4 ) = f ( 5 ) − f ( 3 ) \mathbf{f(4)=f(5)-f(3)} f(4)=f(5)f(3)

    f ( 2 n ) = f ( 2 n + 1 ) − f ( 2 n − 1 ) \mathbf{f(2n)=f(2n+1)-f(2n-1)} f(2n)=f(2n+1)f(2n1)
    将式子加起来得到 ∑ i = 1 n f ( 2 i ) = f ( 2 n + 1 ) − f ( 1 ) = f ( 2 n + 1 ) − 1 \mathbf{\sum_{i=1}^nf(2i)=f(2n+1)-f(1)=f(2n+1)-1} i=1nf(2i)=f(2n+1)f(1)=f(2n+1)1

  6. f ( n ) = f ( m ) f ( n − m + 1 ) + f ( m − 1 ) f ( n − m ) , n ≥ m ≥ 1 \mathbf{f(n)=f(m)f(n-m+1)+f(m-1)f(n-m),n\ge m \ge 1} f(n)=f(m)f(nm+1)+f(m1)f(nm),nm1
    证明:还是列式子找规律吧…
    f ( n ) = 1 ⋅ f ( n ) + 0 \mathbf{f(n)=1\cdot f(n)+0} f(n)=1f(n)+0
    f ( n ) = f ( n − 1 ) + f ( n − 2 ) \mathbf{f(n)=f(n-1)+f(n-2)} f(n)=f(n1)+f(n2)
    f ( n ) = 2 f ( n − 2 ) + f ( n − 3 ) \mathbf{f(n)=2f(n-2)+f(n-3)} f(n)=2f(n2)+f(n3)
    f ( n ) = 3 f ( n − 3 ) + 2 f ( n − 4 ) \mathbf{f(n)=3f(n-3)+2f(n-4)} f(n)=3f(n3)+2f(n4)

    我们设 f ( n ) = a i + 1 f ( n − i ) + b i f ( n − i − 1 ) , i ≥ 0 \mathbf{f(n)=a_{i+1}f(n-i)+b_if(n-i-1),i\ge 0} f(n)=ai+1f(ni)+bif(ni1),i0,很根据上面列的式子容易发现 a i 和 b i \mathbf{a_i和b_i} aibi之间的联系,它们满足 a i + 1 = a i + b i − 1 , b i = a i ⇒ a i + 1 = a i + a i − 1 \mathbf{a_{i+1}=a_i+b_{i-1},b_{i}=a_{i}\Rightarrow a_{i+1}=a_i+a_{i-1}} ai+1=ai+bi1,bi=aiai+1=ai+ai1,再结合 a 2 = 1 , a 1 = b 1 = 1 ⇒ \mathbf{a_2=1,a_1=b_1=1\Rightarrow} a2=1,a1=b1=1我们发现 a i \mathbf{a_i} ai就是一个斐波拉契数列,干脆将 a i \mathbf{a_i} ai写为 f ( i ) \mathbf{f(i)} f(i),于是有 f ( n ) = f ( i + 1 ) f ( n − i ) + f ( i ) f ( n − i − 1 ) \mathbf{f(n)=f(i+1)f(n-i)+f(i)f(n-i-1)} f(n)=f(i+1)f(ni)+f(i)f(ni1),令 m = i + 1 \mathbf{m=i+1} m=i+1我们就能得到 f ( n ) = f ( m ) f ( n − m + 1 ) + f ( m − 1 ) f ( n − m ) \mathbf{f(n)=f(m)f(n-m+1)+f(m-1)f(n-m)} f(n)=f(m)f(nm+1)+f(m1)f(nm),其中 n ≥ m ≥ 1 \mathbf{n\ge m\ge 1} nm1
    ps:该式子也常常写作 f ( n + m ) = f ( m − 1 ) f ( n ) + f ( m ) f ( n + 1 ) \mathbf{f(n+m)=f(m-1)f(n)+f(m)f(n+1)} f(n+m)=f(m1)f(n)+f(m)f(n+1)

  7. f ( n − 1 ) f ( n + 1 ) = f ( n ) 2 + ( − 1 ) n \mathbf{f(n-1)f(n+1)=f(n)^2+(-1)^n} f(n1)f(n+1)=f(n)2+(1)n
    证明:我们只需要证明到这个式子满足斐波拉契数列的定义即可,也就是说满足 ∀ n ≥ 2 有 f ( n ) = f ( n − 1 ) + f ( n − 2 ) \mathbf{\forall n\ge2有f(n)=f(n-1)+f(n-2)} n2f(n)=f(n1)+f(n2)即可,我们采用数学归纳法证明这一点。
    首先我们令 f ( 2 ) = 1 , f ( 1 ) = 1 , f ( 0 ) = 0 \mathbf{f(2)=1,f(1)=1,f(0)=0} f(2)=1,f(1)=1,f(0)=0,当 n = 1 \mathbf{n=1} n=1时代入式子有 f ( 0 ) f ( 2 ) = f ( 1 ) 2 + ( − 1 ) 1 \mathbf{f(0)f(2)=f(1)^2+(-1)^1} f(0)f(2)=f(1)2+(1)1显然是正确的。
    然后当 n = 2 \mathbf{n=2} n=2时有 f ( 1 ) f ( 3 ) = f ( 2 ) 2 + ( − 1 ) 2 ⇒ f ( 3 ) = 2 \mathbf{f(1)f(3)=f(2)^2+(-1)^2\Rightarrow f(3)=2} f(1)f(3)=f(2)2+(1)2f(3)=2,符合 f ( 3 ) = f ( 2 ) + f ( 1 ) \mathbf{f(3)=f(2)+f(1)} f(3)=f(2)+f(1)的递推定义。
    现在假设 n = k \mathbf{n=k} n=k的时候该式子符合斐波拉契数列递推式,也就是能够推出 f ( k + 1 ) = f ( k ) + f ( k − 1 ) \mathbf{f(k+1)=f(k)+f(k-1)} f(k+1)=f(k)+f(k1),那先把该式子代入 f ( n − 1 ) f ( n + 1 ) = f ( n ) 2 + ( − 1 ) n \mathbf{f(n-1)f(n+1)=f(n)^2+(-1)^n} f(n1)f(n+1)=f(n)2+(1)n中得到 f ( k − 1 ) f ( k + 1 ) = f ( k ) 2 + ( − 1 ) k ⇒ f ( k − 1 ) f ( k ) + f ( k − 1 ) 2 = f ( k ) 2 + ( − 1 ) k \mathbf{f(k-1)f(k+1)=f(k)^2+(-1)^k\Rightarrow f(k-1)f(k)+f(k-1)^2=f(k)^2+(-1)^k} f(k1)f(k+1)=f(k)2+(1)kf(k1)f(k)+f(k1)2=f(k)2+(1)k(①式),又因为当 n = k + 1 \mathbf{n=k+1} n=k+1时候有 f ( k + 2 ) f ( k ) = f ( k + 1 ) 2 + ( − 1 ) k + 1 \mathbf{f(k+2)f(k)=f(k+1)^2+(-1)^{k+1}} f(k+2)f(k)=f(k+1)2+(1)k+1,移项后有 f ( k + 2 ) = f ( k + 1 ) 2 + ( − 1 ) k + 1 f ( k ) = f ( k ) 2 + 2 f ( k ) f ( k − 1 ) + f ( k − 1 ) 2 + ( − 1 ) k + 1 f ( k ) \mathbf{f(k+2)=\frac{f(k+1)^2+(-1)^{k+1}}{f(k)}=\frac{f(k)^2+2f(k)f(k-1)+f(k-1)^2+(-1)^{k+1}}{f(k)}} f(k+2)=f(k)f(k+1)2+(1)k+1=f(k)f(k)2+2f(k)f(k1)+f(k1)2+(1)k+1,代入①式 得到 f ( k + 2 ) = f ( k ) 2 + 2 f ( k ) f ( k − 1 ) + f ( k ) 2 + ( − 1 ) k − f ( k ) f ( k − 1 ) + ( − 1 ) k + 1 f ( k ) \mathbf{f(k+2)=\frac{f(k)^2+2f(k)f(k-1)+f(k)^2+(-1)^k-f(k)f(k-1)+(-1)^{k+1}}{f(k)}} f(k+2)=f(k)f(k)2+2f(k)f(k1)+f(k)2+(1)kf(k)f(k1)+(1)k+1,整理一下得到 f ( k + 2 ) = 2 f ( k ) 2 + f ( k ) f ( k − 1 ) f ( k ) = 2 f ( k ) + f ( k − 1 ) = f ( k ) + f ( k + 1 ) \mathbf{f(k+2)=\frac{2f(k)^2+f(k)f(k-1)}{f(k)}=2f(k)+f(k-1)=f(k)+f(k+1)} f(k+2)=f(k)2f(k)2+f(k)f(k1)=2f(k)+f(k1)=f(k)+f(k+1),于是我们知道在 n = k + 1 \mathbf{n=k+1} n=k+1的时候原命题也能够推导出斐波拉契递推式,根据数学归纳法斐波拉契数列具有原命题公式的性质。

  8. 斐波拉契数列相邻两项互素,即满足 g c d ( f ( n ) , f ( n + 1 ) ) = 1 \mathbf{gcd(f(n),f(n+1))=1} gcd(f(n),f(n+1))=1
    证明: g c d ( f ( n ) , f ( n + 1 ) ) = g c d ( f ( n ) , f ( n ) + f ( n − 1 ) ) = g c d ( f ( n − 1 ) , f ( n ) ) = g c d ( f ( n − 1 ) , f ( n − 1 ) + f ( n − 2 ) ) = g c d ( f ( n − 2 ) , f ( n − 1 ) ) = . . . = g c d ( f ( 1 ) , f ( 1 ) + f ( 0 ) ) = g c d ( f ( 0 ) , f ( 1 ) ) = g c d ( 0 , 1 ) = 1 \mathbf{\begin{aligned} gcd(f(n),f(n+1)) & = gcd(f(n),f(n)+f(n-1))=gcd(f(n-1),f(n)) \\ & = gcd(f(n-1),f(n-1)+f(n-2))=gcd(f(n-2),f(n-1)) \\ & = ... \\ & = gcd(f(1),f(1)+f(0))=gcd(f(0),f(1))=gcd(0,1)=1 \\ \end{aligned}} gcd(f(n),f(n+1))=gcd(f(n),f(n)+f(n1))=gcd(f(n1),f(n))=gcd(f(n1),f(n1)+f(n2))=gcd(f(n2),f(n1))=...=gcd(f(1),f(1)+f(0))=gcd(f(0),f(1))=gcd(0,1)=1

  9. g c d ( f ( n ) , f ( m ) ) = f ( g c d ( n , m ) ) \mathbf{gcd(f(n),f(m))=f(gcd(n,m))} gcd(f(n),f(m))=f(gcd(n,m))
    证明:首先容易验证 n = 0 或 m = 0 \mathbf{n=0或m=0} n=0m=0命题是正确的,现在假设 n ≥ m ≥ 1 \mathbf{n\ge m\ge 1} nm1,那么根据性质6我们有:
    g c d ( f ( n ) , f ( m ) ) = g c d ( f ( m ) f ( n − m + 1 ) + f ( m − 1 ) f ( n − m ) , f ( m ) ) = g c d ( f ( m − 1 ) f ( n − m ) , f ( m ) ) = g c d ( f ( n − m ) , f ( m ) ) . . . . . . . . 根 据 性 质 8 由 于 g c d ( f ( m − 1 ) , f ( m ) ) = 1 = g c d ( f ( n % m ) , f ( m ) ) = g c d ( f ( n % m ) , f ( m % ( n % m ) ) ) = g c d ( f ( n % ( m % ( n % m ) ) ) ) , f ( m % ( n % m ) ) ) = . . . ( 这 个 过 程 与 求 g c d 的 过 程 是 一 样 的 ) = g c d ( f ( 0 ) , f ( g c d ( n , m ) ) ) = g c d ( 0 , f ( g c d ( n , m ) ) ) = f ( g c d ( n , m ) ) \mathbf{\begin{aligned} gcd(f(n),f(m)) & = gcd(f(m)f(n-m+1)+f(m-1)f(n-m),f(m)) \\ & = gcd(f(m-1)f(n-m),f(m)) \\ & = gcd(f(n-m),f(m))........根据性质8由于gcd(f(m-1),f(m))=1\\ & = gcd(f(n\%m),f(m)) \\ & = gcd(f(n\%m),f(m\%(n\%m))) \\ & = gcd(f(n\%(m\%(n\%m)))),f(m\%(n\%m))) \\ & = ...(这个过程与求gcd的过程是一样的)\\ & = gcd(f(0),f(gcd(n,m)))=gcd(0,f(gcd(n,m)))=f(gcd(n,m))\\ \end{aligned}} gcd(f(n),f(m))=gcd(f(m)f(nm+1)+f(m1)f(nm),f(m))=gcd(f(m1)f(nm),f(m))=gcd(f(nm),f(m))........8gcd(f(m1),f(m))=1=gcd(f(n%m),f(m))=gcd(f(n%m),f(m%(n%m)))=gcd(f(n%(m%(n%m)))),f(m%(n%m)))=...(gcd)=gcd(f(0),f(gcd(n,m)))=gcd(0,f(gcd(n,m)))=f(gcd(n,m))
    由于n与m地位对等,故当 m ≥ n ≥ 1 \mathbf{m\ge n\ge 1} mn1时命题也正确,故原命题正确。

  10. n ∣ m ⇔ f ( n ) ∣ f ( m ) \mathbf{n\mid m\Leftrightarrow f(n)\mid f(m)} nmf(n)f(m)
    证明:若 n ∣ m \mathbf{n\mid m} nm,根据性质9,则 g c d ( f ( n ) , f ( m ) ) = f ( g c d ( n , m ) ) = f ( n ) ⇒ f ( n ) ∣ f ( m ) \mathbf{gcd(f(n),f(m))=f(gcd(n,m))=f(n)\Rightarrow f(n)\mid f(m)} gcd(f(n),f(m))=f(gcd(n,m))=f(n)f(n)f(m)
    f ( n ) ∣ f ( m ) \mathbf{f(n)\mid f(m)} f(n)f(m),根据性质9,则 g c d ( f ( n ) , f ( m ) ) = f ( n ) = f ( g c d ( n , m ) ) ⇒ n = g c d ( n , m ) ⇒ n ∣ m \mathbf{gcd(f(n),f(m))=f(n)=f(gcd(n,m))\Rightarrow n=gcd(n,m)\Rightarrow n\mid m} gcd(f(n),f(m))=f(n)=f(gcd(n,m))n=gcd(n,m)nm
    综上原命题正确。

  11. x ∣ f ( n ) \mathbf{x\mid f(n)} xf(n),则 x ∣ f ( k n ) \mathbf{x\mid f(kn)} xf(kn)
    证明:根据性质9我们有 g c d ( f ( n ) , f ( k n ) ) = f ( n ) \mathbf{gcd(f(n),f(kn))=f(n)} gcd(f(n),f(kn))=f(n),易知原命题正确。

  12. 设数列 a n + 1 = 1 + a n , a 1 = 1 \mathbf{a_{n+1}=1+a_n,a_1=1} an+1=1+an,a1=1,那么 a n \mathbf{a_n} an的通项公式 a n = f ( n + 1 ) f ( n ) \mathbf{a_n=\frac{f(n+1)}{f(n)}} an=f(n)f(n+1)
    证明:代入验证即可。

  13. f ( 2 n ) = f ( n + 1 ) 2 − f ( n − 1 ) 2 \mathbf{f(2n)=f(n+1)^2-f(n-1)^2} f(2n)=f(n+1)2f(n1)2
    证明:结合性质6我们进行展开即可。
    f ( n + 1 ) 2 − f ( n − 1 ) 2 = [ f ( n ) + f ( n − 1 ) ] 2 − f ( n − 1 ) 2 = f ( n ) 2 + 2 f ( n ) f ( n − 1 ) = f ( n ) [ f ( n ) + f ( n − 1 ) + f ( n − 1 ) ] = f ( n ) [ f ( n + 1 ) + f ( n − 1 ) ] = f ( n ) f ( n + 1 ) + f ( n − 1 ) f ( n ) . . . . . 结 合 性 质 6 我 们 推 出 下 面 的 式 子 = f ( 2 n ) \mathbf{\begin{aligned} f(n+1)^2-f(n-1)^2 &= [f(n)+f(n-1)]^2-f(n-1)^2\\ &= f(n)^2+2f(n)f(n-1)\\ &=f(n)[f(n)+f(n-1)+f(n-1)]\\ &=f(n)[f(n+1)+f(n-1)]\\ &=f(n)f(n+1)+f(n-1)f(n).....结合性质6我们推出下面的式子\\ &=f(2n) \end{aligned} } f(n+1)2f(n1)2=[f(n)+f(n1)]2f(n1)2=f(n)2+2f(n)f(n1)=f(n)[f(n)+f(n1)+f(n1)]=f(n)[f(n+1)+f(n1)]=f(n)f(n+1)+f(n1)f(n).....6=f(2n)

  14. 3 f ( n ) = f ( n + 2 ) + f ( n − 2 ) \mathbf{3f(n)=f(n+2)+f(n-2)} 3f(n)=f(n+2)+f(n2)
    证明:直接代入递推式即可。
    f ( n + 2 ) + f ( n − 2 ) = f ( n + 1 ) + f ( n ) + f ( n ) − f ( n − 1 ) = 2 f ( n ) + f ( n + 1 ) − f ( n − 1 ) = 2 f ( n ) + f ( n ) = 3 f ( n ) \mathbf{\begin{aligned} f(n+2)+f(n-2)&= f(n+1)+f(n)+f(n)-f(n-1)\\ &= 2f(n)+f(n+1)-f(n-1)\\ &= 2f(n)+f(n)=3f(n) \end{aligned} } f(n+2)+f(n2)=f(n+1)+f(n)+f(n)f(n1)=2f(n)+f(n+1)f(n1)=2f(n)+f(n)=3f(n)

  15. f ( n + 1 ) \mathbf{f(n+1)} f(n+1)等于序列 1 , 2 , 3 , . . . , n \mathbf{1,2,3,...,n} 1,2,3,...,n的所有为不含相邻整数的子集的个数。(其中 n = 0 \mathbf{n=0} n=0的时候代表空集)
    证明:首先当 n ≤ 2 \mathbf{n\le 2} n2的时候容易验证结论成立,现在考虑 n > 2 \mathbf{n>2} n>2的时候,我们可以将序列 1 , 3 , 4 , . . . , n \mathbf{1,3,4,...,n} 1,3,4,...,n的子集分为包含 n \mathbf{n} n和不包含 n \mathbf{n} n的子集,对于不包含 n \mathbf{n} n的子集(不含相邻整数)的个数一定是 f ( n ) \mathbf{f(n)} f(n),而对于包含 n \mathbf{n} n的子集由于要求不含相邻整数故不能含有 n − 1 \mathbf{n-1} n1,故只能在 1 , 2 , 3 , . . , n − 2 \mathbf{1,2,3,..,n-2} 1,2,3,..,n2中选择剩下的元素,故有 f ( n − 1 ) \mathbf{f(n-1)} f(n1)种,综上 f ( n + 1 ) = f ( n ) + f ( n − 1 ) \mathbf{f(n+1)=f(n)+f(n-1)} f(n+1)=f(n)+f(n1),而这恰好符合斐波拉契的递推式。

  16. 斐波拉契数列中相邻两项的前项比后项的极限是 5 − 1 2 \mathbf{\frac{\sqrt 5-1}2} 25 1
    证明:考虑 f ( n ) f ( n + 1 ) = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] 1 5 [ ( 1 + 5 2 ) n + 1 − ( 1 − 5 2 ) n + 1 ] = 1 − ( 1 − 5 1 + 5 ) n 1 + 5 2 ( 1 − ( 1 − 5 1 + 5 ) n ) = 1 − ( 1 − 5 1 + 5 ) n 1 − ( 1 − 5 1 + 5 ) n ⋅ 5 − 1 2 \mathbf{\frac{f(n)}{f(n+1)}=\frac{\frac{1}{\sqrt 5}[(\frac{1+\sqrt 5}{2})^n-(\frac{1-\sqrt 5}{2})^n]}{\frac{1}{\sqrt 5}[(\frac{1+\sqrt 5}{2})^{n+1}-(\frac{1-\sqrt 5}{2})^{n+1}]}=\frac{1-{(\frac{1-\sqrt 5}{1+\sqrt 5})}^n}{\frac{1+\sqrt 5}2{(1-{(\frac{1-\sqrt 5}{1+\sqrt 5})}^n)}}=\frac{1-{(\frac{1-\sqrt 5}{1+\sqrt 5})}^n}{{1-{(\frac{1-\sqrt 5}{1+\sqrt 5})}^n}}\cdot \frac{\sqrt 5-1}{2}} f(n+1)f(n)=5 1[(21+5 )n+1(215 )n+1]5 1[(21+5 )n(215 )n]=21+5 (1(1+5 15 )n)1(1+5 15 )n=1(1+5 15 )n1(1+5 15 )n25 1,容易看出当 n → + ∞ \mathbf{n\rightarrow +∞} n+时极限是 5 − 1 2 \mathbf{\frac{\sqrt 5 -1}{2}} 25 1

  17. g c d ( f ( n + m ) , f ( n ) ) = g c d ( f ( n ) , f ( m ) ) \mathbf{gcd(f(n+m),f(n))=gcd(f(n),f(m))} gcd(f(n+m),f(n))=gcd(f(n),f(m))
    证明:结合性质6和性质8容易证明。
    g c d ( f ( n + m ) , f ( n ) ) = g c d ( f ( m ) f ( n + 1 ) + f ( m − 1 ) f ( n ) , f ( m ) ) = g c d ( f ( m − 1 ) f ( n ) , f ( m ) ) . . . . 再 根 据 性 质 8 有 下 面 式 子 = g c d ( f ( n ) , f ( m ) ) \mathbf{\begin{aligned} gcd(f(n+m),f(n))&=gcd(f(m)f(n+1)+f(m-1)f(n),f(m))\\ &=gcd(f(m-1)f(n),f(m))....再根据性质8有下面式子\\ &=gcd(f(n),f(m)) \end{aligned} } gcd(f(n+m),f(n))=gcd(f(m)f(n+1)+f(m1)f(n),f(m))=gcd(f(m1)f(n),f(m))....8=gcd(f(n),f(m))

  18. f ( 1 ) + 2 f ( 2 ) + 3 f ( 3 ) + . . . + n f ( n ) = n f ( n + 2 ) − f ( n + 3 ) + 2 \mathbf{f(1)+2f(2)+3f(3)+...+nf(n)=nf(n+2)-f(n+3)+2} f(1)+2f(2)+3f(3)+...+nf(n)=nf(n+2)f(n+3)+2
    证明:

  19. 斐波拉契数列模一个数具有周期性,如果模 n \mathbf{n} n的话每个周期中的元素个数不会超过 n ⋅ n \mathbf{n\cdot n} nn个。

  20. f ( 2 n ) f ( n ) = f ( n − 1 ) + f ( n + 1 ) \mathbf{\frac{f(2n)}{f(n)}=f(n-1)+f(n+1)} f(n)f(2n)=f(n1)+f(n+1)
    证明:结合性质6我们容易证明 f ( n ) [ f ( n + 1 ) + f ( n − 1 ) ] = f ( n ) f ( n + 1 ) + f ( n − 1 ) f ( n ) = f ( 2 n ) \mathbf{f(n)[f(n+1)+f(n-1)] =f(n)f(n+1)+f(n-1)f(n)=f(2n)} f(n)[f(n+1)+f(n1)]=f(n)f(n+1)+f(n1)f(n)=f(2n)

  21. f ( 2 n − 2 m − 2 ) [ f ( 2 n ) + f ( 2 n + 2 ) ] = f ( 2 m + 2 ) + f ( 4 n − 2 m ) , ( n > m ≥ − 1 , 且 n ≥ 1 ) \mathbf{f(2n-2m-2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n-2m) ,( n>m\ge-1,且n\ge1)} f(2n2m2)[f(2n)+f(2n+2)]=f(2m+2)+f(4n2m)(n>m1,n1)

  22. 斐波拉契数列的最后一位数,最后两位数,最后三位数,最后四位数,最后五位数都具有周期性,分别是:60,300,1500,15000,150000。

  23. 如下图所示,杨辉三角写成下图所示后斜对角线上元素之和构成斐波拉契数列。
    acm-基础数论学习笔记(下)_第1张图片

  24. 斐波拉契数列的平方和可以用若干个正方形拼成的矩形来表示,其中正方形的边长是斐波拉契数列的值,面积代表项的平方,拼成的矩形代表斐波拉契数列平方和。容易从图中得出性质3是正确的。
    acm-基础数论学习笔记(下)_第2张图片

  25. 任何一个正整数都可以被唯一地表示成斐波拉契数列中的不相邻项之和。(齐肯多夫定理)
    证明:假设我们要表示 x \mathbf{x} x,那么找到一个最大的n使得 f ( n ) ≤ x < f ( n + 1 ) \mathbf{f(n)\le xf(n)x<f(n+1)成立,那么一定有 x < f ( n + 1 ) = f ( n ) + f ( n − 1 ) ⇒ x − f ( n ) < f ( n − 1 ) \mathbf{xx<f(n+1)=f(n)+f(n1)xf(n)<f(n1),x可以被写成 x = f ( n ) + s \mathbf{x=f(n)+s} x=f(n)+s的形式,并且 s < f ( n − 1 ) \mathbf{ss<f(n1),意味着s中不可能存在与 f ( n ) \mathbf{f(n)} f(n)相邻的项,我们对s做同样的操作,一直到 x \mathbf{x} x被完整表示出来为止,根据刚才的推导显然这些项中没有相邻项。

  26. 模n意义下的斐波拉契数列的周期不会超过6n(皮萨诺周期)。
    证明:较复杂,具体证明在这里。

注意性质1是一个非常有用的性质,虽然里面有根号,但是在遇到取模问题的时候我们可以利用二次剩余来处理这个表达式。

3.佩尔方程

(1).定义

关于整数解的不定方程 x 2 − d y 2 = 1 , d > 0 \mathbf{x^2-dy^2=1,d>0} x2dy2=1d>0被称为是佩尔方程。
关于整数解的不定方程 x 2 − d y 2 = k , k ≠ 1 , d > 0 \mathbf{x^2-dy^2=k,k\ne 1,d>0} x2dy2=k,k=1,d>0则被称为是佩尔型方程。
一般情况下二元二次不定方程都能化为佩尔方程的形式,在有些题目中会涉及到佩尔方程的求解。

(2).性质

对于佩尔方程 x 2 − d y 2 = 1 \mathbf{x^2-dy^2=1} x2dy2=1而言,当 d \mathbf{d} d是一个平方数的时候我们容易求得方程的解,即 x 2 − ( d ) 2 y 2 = ( x − d y ) ( x + d y ) = 1 ⇒ { x − d y = 1 , x + d y = 1 x − d y = − 1 , x + d y = − 1 ⇒ { x = ± 1 y = 0 \mathbf{x^2-(\sqrt d)^2y^2=(x-\sqrt dy)(x+\sqrt d y)=1\Rightarrow \begin{cases} x-\sqrt dy &= 1,x+\sqrt dy &=1 \\ x-\sqrt dy &= -1,x+\sqrt dy &=-1 \end{cases}\Rightarrow \begin{cases}x=\pm 1\\ y=0\end{cases} } x2(d )2y2=(xd y)(x+d y)=1{xd yxd y=1,x+d y=1,x+d y=1=1{x=±1y=0
d \mathbf{d} d是一个非平方数的时候,可以证明该方程存在无限多个整数解,由于正数解和负数解的绝对值都是一样的,故我们这里只讨论正数解,负数解就是正数解加个负号,设 x 1 , y 1 \mathbf{x_1,y_1} x1,y1是它的最小正整数解,那么可以写出其通解的公式, ( x n y n ) = ( x 1 d y 1 y 1 x 1 ) n − 1 ⋅ ( x 1 y 1 ) \mathbf{\begin{pmatrix}x_n\\y_n\end {pmatrix}=\begin{pmatrix}x_1 & dy_1\\y_1 & x_1\end{pmatrix}^{n-1}\cdot \begin{pmatrix}x_1\\y_1\end{pmatrix}} (xnyn)=(x1y1dy1x1)n1(x1y1),我们考虑用数学归纳法证明它确实是佩尔方程的解(至于如何证是个通解感兴趣的可以去网上找相关资料),首先 x 2 = x 1 2 + d y 1 2 , y 2 = 2 x 1 y 1 \mathbf{x_2=x_1^2+dy_1^2,y_2=2x_1y_1} x2=x12+dy12,y2=2x1y1,代入佩尔方程得到 x 2 2 − d y 2 2 = ( x 1 2 + d y 1 2 ) 2 − d ( 2 x 1 y 1 ) 2 = ( x 1 2 − d y 1 2 ) 2 = 1 \mathbf{x_2^2-dy_2^2=(x_1^2+dy_1^2)^2-d(2x_1y_1)^2=(x_1^2-dy_1^2)^2=1} x22dy22=(x12+dy12)2d(2x1y1)2=(x12dy12)2=1,因此 x 2 , y 2 \mathbf{x_2,y_2} x2,y2是方程的一个解,假设 x k , y k \mathbf{x_k,y_k} xk,yk是方程的一个解,则 x k + 1 2 − d y k + 1 2 = ( x 1 x k + d y 1 y k ) 2 − d ( y 1 x k + x 1 y k ) 2 = x 1 2 x k 2 + d 2 y 1 2 y k 2 + 2 d x 1 y 1 x k y k − d ( y 1 2 x k 2 + x 1 2 y k 2 + 2 x 1 y 1 x k y k ) = ( x k 2 − d y k 2 ) ( x 1 2 − d y 1 2 ) = 1 \mathbf{x_{k+1}^2-dy_{k+1}^2=(x_1x_k+dy_1y_k)^2-d(y_1x_k+x_1y_k)^2=x_1^2x_k^2+d^2y_1^2y_k^2+2dx_1y_1x_ky_k-d(y_1^2x_k^2+x_1^2y_k^2+2x_1y_1x_ky_k)=(x_k^2-dy_k^2)(x_1^2-dy_1^2)=1} xk+12dyk+12=(x1xk+dy1yk)2d(y1xk+x1yk)2=x12xk2+d2y12yk2+2dx1y1xkykd(y12xk2+x12yk2+2x1y1xkyk)=(xk2dyk2)(x12dy12)=1,因此 x k + 1 , y k + 1 \mathbf{x_{k+1},y_{k+1}} xk+1,yk+1也是佩尔方程的一个解。
除了将解的递推关系写成矩阵形式,我们也可以写成 x n + y n d = ( x 1 + y 1 d ) n , n ≥ 0 \mathbf{x_n+y_n\sqrt d=(x_1+y_1\sqrt d)^n,n\ge 0} xn+ynd =(x1+y1d )n,n0的形式,这样套一个二次域快速幂即可快速求解任意通解了。

对于佩尔型方程 x 2 − d y 2 = − 1 \mathbf{x^2-dy^2=-1} x2dy2=1(准确来说叫第II型佩尔方程)而言若方程有解,则假设它的最小正整数解为 x 1 , y 1 \mathbf{x_1,y_1} x1,y1,那么通解可以写成 x n + y n d = ( x 1 + y 1 d ) 2 n + 1 , n ≥ 0 \mathbf{x_n+y_n\sqrt d=(x_1+y_1\sqrt d)^{2n+1},n\ge 0} xn+ynd =(x1+y1d )2n+1,n0,但对于该方程想要判断它是否有解非常困难,这里给出oeis上的关于使得该方程有解的n的序列oeis:A031396: 1, 2, 5, 10, 13, 17, 26, 29, 37, 41, 50, 53, 58, 61, 65, 73, 74…,一般来说直接查表即可判断该佩尔型方程是否有解。

此外还有一种佩尔型方程 x 2 − d y 2 = k , ∣ k ∣ > 1 \mathbf{x^2-dy^2=k,|k|>1 } x2dy2=k,k>1就更加复杂了(关于有解判定感兴趣的上网查资料),我们考虑一般的佩尔方程 x 2 − d y 2 = 1 \mathbf{x^2-dy^2=1} x2dy2=1的解为 ( r , s ) \mathbf{(r,s)} (r,s),考虑将 x 2 − d y 2 = k 与 r 2 − d s 2 = 1 \mathbf{x^2-dy^2=k与r^2-ds^2=1} x2dy2=kr2ds2=1相乘得到 ( x 2 − d y 2 ) ( r 2 − d s 2 ) = ( x r ± d y s ) 2 − d ( x s ± y r ) 2 = k ) \mathbf{(x^2-dy^2)(r^2-ds^2)=(xr\pm dys)^2-d(xs\pm yr)^2=k)} (x2dy2)(r2ds2)=(xr±dys)2d(xs±yr)2=k),于是得到关于一般的佩尔型方程的通解为 x n = x n − 1 r ± d y n − 1 s , y n = x n − 1 s ± y n − 1 r \mathbf{x_n=x_{n-1}r\pm dy_{n-1}s,y_n=x_{n-1}s\pm y_{n-1}r} xn=xn1r±dyn1s,yn=xn1s±yn1r

这里提供一个解任意佩尔型方程的在线网站:佩尔型方程在线求解

(3).求解方法

这里以标准的佩尔方程 x 2 − d y 2 = 1 , d > 1 为 非 平 方 数 \mathbf{x^2-dy^2=1,d>1为非平方数} x2dy2=1,d>1为例给出两种求解的方法。这两种方法都能够求出佩尔方程的一个最小特解,利用这个最小特解我们能够迅速找到方程的所有解。方法是构造二次域结构体然后快速幂计算即可,不过一般直接for循环递推也行,因为解的增长速度非常快。

[1].暴力法

由于 x = 1 + d y 2 \mathbf{x=\sqrt{1+dy^2}} x=1+dy2 ,我们考虑从1开始枚举 y \mathbf{y} y,然后计算出 x = ⌊ 1 + d y 2 ⌋ \mathbf{x=\lfloor \sqrt{1+dy^2} \rfloor} x=1+dy2 ,然后判断是否满足佩尔方程即可,直到找到第一个解,这一定是最小解。
代码如下:

pi pell(ll d){//计算关于x^2-dy^2=1的一个最小正整数解 
	ll gd=(ll)sqrt(d);
	if(gd*gd==d)return mk(1,0);//判断d是否为平方数
	ll y=1,x;
	while(true){
		x=(ll)sqrtl(1+d*y*y);
		if(x*x-d*y*y==1)break;
		y++;
	}
	return mk(x,y);
}

int main(){
	int t;
	rd(&t);
	while(t--){
		ll d;
		rd(&d);
		pi ans=pell(d);
		wrn(ans.fi,ans.se);
	} 
} 

[2].连分数法

<1>.连分数介绍

先介绍一下连分数,有限的连分数长这样子: a 0 + 1 a 1 + 1 a 2 + 1 ⋱ + 1 a n \mathbf{a_0+\cfrac{1}{a_1+\cfrac{1}{a_2+\cfrac{1}{\ddots+\cfrac 1{a_n}}}}} a0+a1+a2++an1111,这样写太麻烦了,因此我们简记为 A n B n = [ a 0 , a 1 , . . . , a n ] \mathbf{\frac {A_n}{B_n}=[a_0,a_1,...,a_n]} BnAn=[a0,a1,...,an],现在我们看看 A n B n \mathbf{\frac{A_n}{B_n}} BnAn如何计算。
考虑从分数嵌套的最里层开始向外计算,设最里层有 A 0 B 0 = a n \mathbf{\frac {A_0}{B_0}=a_n} B0A0=an,于是有:
A 1 B 1 = a n − 1 + 1 a n = a n − 1 + B 0 A 0 = A 0 a n − 1 + B 0 A 0 ⇒ A 1 = A 0 a n − 1 + B 0 , B 1 = A 0 \mathbf{\frac{A_1}{B_1}=a_{n-1}+\frac 1{a_n}=a_{n-1}+\frac {B_0}{A_0}=\frac{A_0a_{n-1}+B_0}{A_0}\Rightarrow A_1=A_0a_{n-1}+B_0,B_1=A_0} B1A1=an1+an1=an1+A0B0=A0A0an1+B0A1=A0an1+B0,B1=A0
A 2 B 2 = a n − 2 + 1 A 1 B 1 = a n − 2 + B 1 A 1 = A 1 a n − 2 + B 1 A 1 ⇒ A 2 = A 1 a n − 2 + B 1 , B 2 = A 1 \mathbf{\frac{A_2}{B_2}=a_{n-2}+\frac 1{\frac{A_1}{B_1}}=a_{n-2}+\frac {B_1}{A_1}=\frac{A_1a_{n-2}+B_1}{A_1}\Rightarrow A_2=A_1a_{n-2}+B_1,B_2=A_1} B2A2=an2+B1A11=an2+A1B1=A1A1an2+B1A2=A1an2+B1,B2=A1

从上面容易看出关于 A k , B k \mathbf{A_k,B_k} Ak,Bk的递推式: A k = A k − 1 a n − k + B k − 1 , B k = A k − 1 \mathbf{A_k=A_{k-1}a_{n-k}+B_{k-1},B_k=A_{k-1}} Ak=Ak1ank+Bk1,Bk=Ak1,初始条件为 A 0 = a n , B 0 = 1 \mathbf{A_0=a_n,B_0=1} A0=an,B0=1,通过该递推式我们能够将有限的连分式转化为一个分数 A n B n \mathbf{\frac{A_n}{B_n}} BnAn

现在再看一下无限的连分数,它长这样, a 0 + 1 a 1 + 1 a 2 + 1 ⋱ + 1 a k + 1 ⋱ \mathbf{a_0+\cfrac{1}{a_1+\cfrac{1}{a_2+\cfrac{1}{\ddots+\cfrac 1{a_k+\cfrac{1}{\ddots }}}}}} a0+a1+a2++ak+11111,跟有限连分式区别在于它是无限的(废话 ),我们同样简记为 [ a 0 , a 1 , a 2 , . . . ] \mathbf{[a_0,a_1,a_2,...]} [a0,a1,a2,...]
然后这个连分式有什么用呢?这里有一个定理:所有无限连分数都是无理数,并且所有无理数都可以用一种精确的方式表示成无限连分数。
知道了这一点我们就有办法用连分数表示出类似于 3 , 22 . . . \mathbf{\sqrt 3,\sqrt{22}...} 3 ,22 ...这样的无理数了。
然后还有一种特殊的无限连分数,这类无限连分数的 a 0 , a 1 , a 2 , . . . , a k , . . . \mathbf{a_0,a_1,a_2,...,a_k,...} a0,a1,a2,...,ak,...是会周期性重复的,然后可以证明的是每个非完全平方数的开根号并展开成连分数后就是这样一类连分数,即其a序列会发生周期性重复,且其最小循环节是以 a 1 \mathbf{a_1} a1为起点
由于其具有循环节,且从 a 1 \mathbf{a_1} a1开始发生循环,我们不妨将其连分数简记为 [ a 0 ; < a 1 , a 2 , . . . , a n > ] \mathbf{[a_0;]} [a0;<a1,a2,...,an>],其中 a 1 , a 2 , . . , a n \mathbf{a_1,a_2,..,a_n} a1,a2,..,an是它的最小循环节,周期为 n \mathbf{n} n

我们假设某个非完全平方数是 d \mathbf{d} d,那么如何得到 d \mathbf{\sqrt d} d 展开成连分数后的循环节长度呢?这里需要利用另一个可以被证明(对证明感兴趣的去网上搜)的性质: a n = 2 a 0 且 ∀ i ∈ [ 1 , n − 1 ] , a i ≠ 2 a 0 \mathbf{a_n=2a_0且\forall i\in[1,n-1],a_i\ne 2a_0} an=2a0i[1,n1],ai=2a0。利用这个性质,我们不断展开 d \mathbf{\sqrt d} d 的连分数,直到遇到 a k \mathbf{a_k} ak满足 a k = 2 a 0 \mathbf{a_k=2a_0} ak=2a0,那么说明 k = n = 循 环 节 长 度 \mathbf{k=n=循环节长度} k=n=

<2>.应用连分数求解佩尔方程

以上就是连分数的基本内容,现在介绍如何用连分数法求解佩尔方程,这里只考虑 d \mathbf{d} d为非平方数时对应的解。
首先是一个定理: x 2 − d y 2 = 1 \mathbf{x^2-dy^2=1} x2dy2=1,且 d = [ a 0 ; < a 1 , a 2 , . . . , a n > ] \mathbf{\sqrt d=[a_0;]} d =[a0;<a1,a2,...,an>],记 A B = [ a 0 , a 1 , a 2 , . . . , a n − 1 ] \mathbf{\frac AB=[a_0,a_1,a_2,...,a_{n-1}]} BA=[a0,a1,a2,...,an1],那么当 n \mathbf{n} n为偶数时方程最小正整数解为 x 1 = A , y 1 = B \mathbf{x_1=A,y_1=B} x1=A,y1=B,当 n \mathbf{n} n为奇数的时候方程的最小正整数解为 x 1 = 2 A 2 + 1 , y 1 = 2 A B \mathbf{x_1=2A^2+1,y_1=2AB} x1=2A2+1,y1=2AB
根据这个定理我们发现只需要明白 如何把 d \mathbf{\sqrt d} d 展开为连分数 以及 如何把 [ a 0 , a 1 , . . . , a n − 1 ] \mathbf{[a_0,a_1,...,a_{n-1}]} [a0,a1,...,an1]写成分数 A B \mathbf{\frac AB} BA 那么我们就可以求解任意佩尔方程了,对于第二个问题我们已经在前面连分式的介绍中提到了,这里只提出如何解决第一个问题。

首先容易得到 a 0 = ⌊ d ⌋ \mathbf{a_0=\lfloor \sqrt d \rfloor} a0=d ,于是有 1 a 1 + 1 a 2 + 1 ⋱ = d − a 0 \mathbf{\cfrac{1}{a_1+\cfrac{1}{a_2+\cfrac{1}{\ddots}}}=\sqrt d-a_0} a1+a2+111=d a0,进一步有 a 1 + 1 a 2 + 1 a 3 + 1 ⋱ = 1 d − a 0 = d + a 0 d − a 0 2 \mathbf{a_1+\cfrac{1}{a_2+\cfrac{1}{a_3+\cfrac{1}{\ddots}}}=\frac{1}{\sqrt d-a_0}=\frac{\sqrt d+a_0}{d-a_0^2}} a1+a2+a3+111=d a01=da02d +a0
好像很难发现规律,那就给出一个定理吧:可以证明 a k + 1 a k + 1 + 1 a k + 1 + 1 ⋱ = d + c k b k \mathbf{a_k+\cfrac{1}{a_{k+1}+\cfrac 1{a_{k+1}+\cfrac 1{\ddots}}}=\frac{\sqrt d+c_k}{b_k}} ak+ak+1+ak+1+111=bkd +ck成立,其中 c k , d k \mathbf{c_k,d_k} ck,dk均是整数。,现在的问题在于怎么求出 c k , d k \mathbf{c_k,d_k} ck,dk
显然 a k = ⌊ d + c k b k ⌋ \mathbf{a_k=\lfloor \frac{\sqrt d+c_k}{b_k} \rfloor} ak=bkd +ck,于是 a k + 1 + 1 a k + 2 + 1 ⋱ = 1 d + c k b k − a k = b k ( d + a k b k − c k ) d − ( c k − a k b k ) 2 \mathbf{a_{k+1}+\cfrac1{a_{k+2}+\cfrac 1{\ddots}}=\cfrac{1}{\frac{\sqrt d+c_k}{b_k}-a_k}=\frac{b_k(\sqrt d+a_kb_k-c_k)}{d-(c_k-a_kb_k)^2}} ak+1+ak+2+11=bkd +ckak1=d(ckakbk)2bk(d +

你可能感兴趣的:(数论,acm竞赛,算法)