现在的位置: 首页 > 综合 > 正文

连分数求解Pell方程 连分数求解Pell方程

2017年11月04日 ⁄ 综合 ⁄ 共 1571字 ⁄ 字号 评论关闭
 

连分数求解Pell方程

分类: 数论 126人阅读 评论(0) 收藏 举报

如果我们求出Pell方程的最小正整数解后,就可以根据递推式求出所有的解。




则根据上式我们可以构造矩阵,然后就可以快速幂了。




这样就可以求出第k大的解。


HDU3292题就要用到上面的矩阵方法求第k大的解。


题目:Smith's Problem 


题意:求方程x^2-N*y^2=1的最小正整数解。本题要用到高精度,所以用Java。


[java] view
plain
copy

  1. import java.math.BigInteger;    
  2. import java.util.Scanner;    
  3.   
  4. public class Main  
  5. {    
  6.     public static void solve(int n)   
  7.     {    
  8.         BigInteger N, p1, p2, q1, q2, a0, a1, a2, g1, g2, h1, h2,p,q;    
  9.         g1 = q2 = p1 = BigInteger.ZERO;    
  10.         h1 = q1 = p2 = BigInteger.ONE;    
  11.         a0 = a1 = BigInteger.valueOf((int)Math.sqrt(1.0*n));  
  12.         BigInteger ans=a0.multiply(a0);  
  13.         if(ans.equals(BigInteger.valueOf(n)))  
  14.         {  
  15.             System.out.println("No solution!");  
  16.             return;  
  17.         }  
  18.         N = BigInteger.valueOf(n);    
  19.         while (true)   
  20.         {    
  21.             g2 = a1.multiply(h1).subtract(g1);       
  22.             h2 = N.subtract(g2.pow(2)).divide(h1);    
  23.             a2 = g2.add(a0).divide(h2);            
  24.             p = a1.multiply(p2).add(p1);             
  25.             q = a1.multiply(q2).add(q1);            
  26.             if (p.pow(2).subtract(N.multiply(q.pow(2))).compareTo(BigInteger.ONE) == 0break;  
  27.             g1 = g2;h1 = h2;a1 = a2;    
  28.             p1 = p2;p2 = p;    
  29.             q1 = q2;q2 = q;    
  30.         }  
  31.         System.out.println(p+" "+q);  
  32.     }    
  33.      
  34.     public static void main(String[] args)   
  35.     {    
  36.         Scanner cin = new Scanner(System.in);    
  37.         while(cin.hasNextInt())  
  38.         {  
  39.             solve(cin.nextInt());     
  40.         }  
  41.     }    
  42. }    

抱歉!评论已关闭.