题目链接

脑补知识:佩尔方差

上面说的貌似很明白,最小的i,对应最小的解

然而我理解成,一个循环的解了,然后就是搞不对,后来,仔细看+手工推导发现了问题。i从0开始变量,知道第一个满足等式的解就是最小解。

问题转化为求根号n的连分数问题,分子就是x,分母就是y

要求的分子,分母,问题又转化为:根号n的连分数表示,对,求出其连分数表示就OK了

先求出a的序列是什么?

第64题,就是求a的序列的。

a求出来了,要求出分子分母的表达式。

第65题,就是已经知道了a的序列,求分子,当然也可以求分母的

分子,分母求出来了,在验证:X*X-D*Y*Y=1时候就是最小解

问题真是一环套一环的。

Python程序:

import time as time 

start = time.time()

def getD(N):
x_max ,y_max= 0,0
D = 0
x,y = 0,0
for S in range(2,N+1):
x,y = resolve(S)
if x>x_max:
x_max ,y_max= x,y
D = S
return D,x_max,y_max def resolve(S):
m = 0
d = 1
a0 = int(S**0.5)
if a0*a0 == S :return -1,-1;
a= a0
li = [a]
x,y = 1,1
while x*x-S*y*y!=1:
m = d*a - m
d = (S - m*m)/d
a = int((a0 + m)/d)
li.append(a)
x = getX(li)
y = getY(li)
# print li
return x,y; def getX(li):
x0 = 1
x1 = li[0]
li = li[1:]
for l in li:
x = l * x1 + x0
x0 = x1
x1 = x
return x def getY(li):
y0 = 0
y1 = 1
li = li[1:]
for l in li:
y = l * y1 + y0
y0 = y1
y1 = y
return y if __name__ == '__main__': start = time.time()
N = 1000
D ,x_max,y_max= getD(N)
print "running time={0}seconds,D={1},x_max={2},y_max={3}".format(time.time()-start,D,x_max,y_max)

求的是最小解X的最大值时候的D,答案是661

然而:

x_max=16421658242965910275055840472270471049

y_max=638728478116949861246791167518480580

这个值好大的

附一:python程序:

from math import sqrt
from time import time def prefect_sqrt(n):
return int(sqrt(n))**2 == n def floor_root(n):
return int(sqrt(n)) def chakravals(n):
x_max = 0
for d in range(2,n+1):
if not prefect_sqrt(d):
p1 = floor_root(d)
q1 = 1
m1 = p1**2 - d
# print -p1,(-p1) % abs(m1),(-p1) % abs(m1)
if (-p1) % abs(m1) ==0:
x1 = abs(m1)
else:
x1 = (-p1) % abs(m1) while m1!=1:
p0 = p1
q0 = q1
m0 = m1
x0 = x1 p1 = (p0 * x0 +d *q0)/abs(m0)
q1 = (p0 + x0)/abs(m0) m1 = (x0**2 -d)/m0 if (-x0)%abs(m1) ==0:
x1 = abs(x0)
else:
x1 = (-x0)%abs(m1)
if p1>x_max:
x_max = p1
d_max = d
print "d= %04d x = %d"%(d_max,x_max)
print if __name__=='__main__':
start = time()
chakravals(1000)
end = time()
print "time elapse=%f"%(end - start)

Java程序:

这个跑的好慢的

package project61;
import java.math.*; public class P66
{
public static final int precision = 500;
public static void main( String args[] )
{
BigInteger Max = new BigInteger("0");
int ans = 0; outer: for (int D_i = 2; D_i <= 1000; D_i++)
{
BigDecimal D = new BigDecimal(D_i);
BigDecimal SD = calculation.Sqrt(D); BigDecimal SD_i = SD.setScale(0, BigDecimal.ROUND_FLOOR);
if (SD_i.multiply(SD_i).equals(D))
continue; int a[] = calculation.toContinuedFraction(SD, 100); for (int i = 1; i < 100; i++)
{
Fraction temp = new Fraction(a[i],1); for (int j = i - 1; j >= 0; j--)
temp = Fraction.Compute(a[j], temp); BigInteger y_2 = temp.denominator.multiply(temp.denominator);
BigInteger x_2 = temp.numerator.multiply(temp.numerator);
BigInteger result = x_2.subtract(y_2.multiply(D.toBigIntegerExact())).subtract(BigInteger.ONE); if (result.equals(BigInteger.ZERO))
{
if (temp.numerator.compareTo(Max) > 0)
{
Max = temp.numerator;
ans = D_i;
} continue outer;
} }
System.out.print("Warning!\n"); }
System.out.print(ans+"\n");
}
} class Fraction
{
public BigInteger numerator;
public BigInteger denominator; private Fraction()
{ }
public Fraction (int numerator, int denominator)
{
this.numerator = BigInteger.valueOf(numerator);
this.denominator = BigInteger.valueOf(denominator);
}
public static Fraction Compute(int p1, Fraction p2)
{
Fraction ans = new Fraction();
ans.numerator = p2.denominator.add(p2.numerator.multiply(BigInteger.valueOf(p1)));
ans.denominator = p2.numerator.add(BigInteger.ZERO);
return ans;
}
} class calculation
{
private static final BigDecimal N0 = new BigDecimal(0);
private static final BigDecimal N1 = new BigDecimal(1);
private static final BigDecimal N2 = new BigDecimal(2); public static BigDecimal Sqrt(BigDecimal In)
{
BigDecimal N = new BigDecimal(1);
while(true)
{
BigDecimal NN = N.multiply(N);
NN = NN.add(In);
NN = NN.divide(N2);
NN = NN.divide(N, P66.precision, BigDecimal.ROUND_FLOOR); if (NN.equals(N))
break; N = NN;
} return N;
}
public static int[] toContinuedFraction(BigDecimal In, int l)
{
int ans[] = new int[l]; BigDecimal temp = In.add(N0);
for (int i = 0; i < l; i++)
{
ans[i] = Integer.valueOf(temp.setScale(0, BigDecimal.ROUND_FLOOR).toString()).intValue();
temp = temp.subtract(temp.setScale(0, BigDecimal.ROUND_FLOOR));
temp = N1.divide(temp, P66.precision, BigDecimal.ROUND_FLOOR);
}
return ans;
}
}

最后两个程序在网上复制过来的

欧拉工程第66题:Diophantine equation的更多相关文章

  1. 欧拉工程第69题:Totient maximum

    题目链接 欧拉函数φ(n)(有时也叫做phi函数)可以用来计算小于n 的数字中与n互质的数字的个数. 当n小于1,000,000时候,n/φ(n)最大值时候的n. 欧拉函数维基百科链接 这里的是p是n ...

  2. 欧拉工程第70题:Totient permutation

    题目链接 和上面几题差不多的 Euler's Totient function, φ(n) [sometimes called the phi function]:小于等于n的数并且和n是互质的数的个 ...

  3. 欧拉工程第67题:Maximum path sum II

    By starting at the top of the triangle below and moving to adjacent numbers on the row below, the ma ...

  4. 欧拉工程第65题:Convergents of e

    题目链接 现在做这个题目真是千万只草泥马在心中路过 这个与上面一题差不多 这个题目是求e的第100个分数表达式中分子的各位数之和 What is most surprising is that the ...

  5. 欧拉工程第56题:Powerful digit sum

    题目链接   Java程序 package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; im ...

  6. 欧拉工程第55题:Lychrel numbers

    package projecteuler51to60; import java.math.BigInteger; import java.util.Iterator; import java.util ...

  7. 欧拉工程第54题:Poker hands

    package projecteuler51to60; import java.awt.peer.SystemTrayPeer; import java.io.BufferedReader; impo ...

  8. 欧拉工程第53题:Combinatoric selections

    package projecteuler51to60; class p53{ void solve1(){ int count=0; int Max=1000000; int[][] table=ne ...

  9. 欧拉工程第52题:Permuted multiples

    题目链接 题目: 125874和它的二倍,251748, 包含着同样的数字,只是顺序不同. 找出最小的正整数x,使得 2x, 3x, 4x, 5x, 和6x都包含同样的数字. 这个题目相对比较简单 暴 ...

随机推荐

  1. Java中提供的工具类

    System.arraycopy介绍 (1).System.arraycopy用于拷贝数组 arraycopy(Object src, int srcPos, Object dest, int des ...

  2. linux服务器报No space left on device错误的解决过程记录

    起因 今天在本地提交了点代码,但到服务器上git pull的时候提示No space left on device,第一反应是猜想可能硬盘满了(很有可能是log导致的),不过想想又觉得不太可能,这台服 ...

  3. php win主机下实现ISAPI_Rewrite伪静态

    有的win主机iss不支持 .htaccess 文件, 我在这里指的不是本地 在本地的话用apmserv服务器可以用.htaccess 文件,用apmserv服务器环境配置伪静态可以看 php 伪静态 ...

  4. Linux之父访谈录:设计内核只为了好玩

    2010-09-20 10:36 “有 些人生来就具有统率百万人的领袖风范;另一些人则是为写出颠覆世界的软件而生.唯一一个能同时做到这两 者的人,就是Linus Torvalds.”这是美国<时 ...

  5. apache+tomcat整合

    一 .Apache与Tomcat的比较 apache支持静态页面,tomcat支持动态的,比如servlet等. 一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是 ...

  6. 微软更换考试中心后报名攻略以及MCT半价

    微软从Prometric更换为Pearson的考试中心,比起以前的预约流程更加便捷. Pearson VUE为微软公司提供MCP考试服务 Pearson VUE为微软公司提供MCP考试服务 http: ...

  7. 源码编译安装MySQL 5.7.9

    安装CentOS 6.3 配置yum:[root@hank-yoon ~]# cd /etc/yum.repos.d/ [root@hank-yoon yum.repos.d]# mkdir a [r ...

  8. Sales_item

    #ifndef SALESITEM_H #define SALESITEM_H // Definition of Sales_item class and related functions goes ...

  9. IOS中Retain和Copy的区别

    1 ,可读性: readonly  . readwrite@property(readwrite,....) valueType value;这个属性是变量的默认属性,就是如果你 (readwrite ...

  10. telnet命令判断端口是否通不通

    以上得出结论80端口不通 如果连接成功,想要退出telnet的话,ctrl+],然后输入quit 查看iptables vi /etc/sysconfig/iptables   #编辑防火墙配置文件  ...