`
OpenMind
  • 浏览: 179575 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Project Euler Problem 80-高精度开方-牛顿逼近法

阅读更多
It is well known that if the square root of a natural number is not an integer, then it is irrational. The decimal expansion of such square roots is infinite without any repeating pattern at all.

The square root of two is 1.41421356237309504880..., and the digital sum of the first one hundred decimal digits is 475.

For the first one hundred natural numbers, find the total of the digital sums of the first one hundred decimal digits for all the irrational square roots.

这个题涉及到高精度开方,像python,haskell等语言原生支持高精度小数,做这个题不成问题,直接使用api即可。我习惯用java,研究BigDecimal发现里面没有开方的方法,所以需要手动实现。可以采用牛顿逼近法解决开方问题,可以用BigDecimal实现高精度。牛顿逼近法参见:http://baike.baidu.com/view/1514354.htm
// 0.0000001是精度,f是待求根的函数,df是f的导数,x0是初值
  public static double newtonMehtod(F f, DF df, double x0) {
		double x1 = x0 - f.f(x0) / df.df(x0);
		while (Math.abs(x1 - x0) > 0.0000001) {
			x0 = x1;
			x1 = x0 - f.f(x0) / df.df(x0);
		}
		return x1;
  }
//函数f(x)
public interface F {
	double f(double x);
}
//f(x)的导数f'(x)
public interface DF {
	double df(double x);
}

F和DF的实现类没贴上来。
下面用BigDecimal把上述算法翻译一遍:
static int prec = 100;
	static BigDecimal precE;
	static {
		String e = "-0.";
		for (int i = 0; i < prec; i++) {
			e += "0";
		}
		e += "1";
		precE = new BigDecimal(e);
	}

	public static BigDecimal newtonMehtod(F f, DF df, double x00) {
		BigDecimal x0 = BigDecimal.valueOf(x00);
		BigDecimal x1 = x0.add(f.f(x0)
				.divide(df.df(x0), BigDecimal.ROUND_HALF_EVEN).negate());
		while (x1.add(x0.negate()).abs().add(precE).compareTo(BigDecimal.ZERO) > 0) {
			x0 = x1;
			x1 = x0.add(f.f(x0).divide(df.df(x0), BigDecimal.ROUND_HALF_EVEN)
					.negate());
		}
		return x1;
	}

public interface F {
	BigDecimal f(BigDecimal x);
}
public interface DF {
	BigDecimal df(BigDecimal x);
}

当prec取100时,算出来2的平方根是:
1.4142135623730950488016887242096980785696718
753769480731766797379907324784621070388503875
343276415727350138462309122970249248360558507
372126441214970999358314132226659275055927557
999505011527820605714701095599716059702745345
968620147285174186408891986095523.
有了上面的探索,解决80题就不是难事了
另外,上述方法也适合求多项式的根,想知道更多,可以去翻《数值分析》
0
0
分享到:
评论
2 楼 OpenMind 2012-02-01  
chenmouren 写道
军哥v5!ps: pythan写错了。

1 楼 chenmouren 2012-02-01  
军哥v5!ps: pythan写错了。

相关推荐

    openeuler-lsb-5.0-1.oe2203.src.rpm

    基于openEuler20.03TLS版本编译openGauss源码时需要的软件包: 1. openeuler-lsb-5.0-1.oe2203.src.rpm 2. git-lfs-linux-arm64-v3.3.0.tar.gz 3. flex-2.5.39.tar.bz2

    project euler problem 5

    题目:Project Euler问题5——寻找最小公倍数 在Project Euler的问题集中,问题5要求我们找到能被1至20所有数字整除的最小正整数。这个问题实际上是在寻找这组数字的最小公倍数(LCM)。对于较小的参数值,如本例中...

    Euler-Structure-2D_Euler-Structure-2D_

    对于Euler-Structure-2D程序,它可能采用了有限差分法,通过近似空间和时间导数来迭代求解。 1. 时空离散化:在空间上,使用均匀或非均匀网格;在时间上,采用隐式或显式时间步进方法。 2. 边界条件:需要设置适当...

    GaussDB_100_1.0.1-DATABASE-EULER20SP8-64bit.tar.gz

    "DATABASE"明确了这是关于数据库的软件,而"EULER20SP8"暗示这可能基于Euler操作系统的一个特定服务包(Service Pack)8,Euler OS是华为开发的一款开源操作系统,适用于云计算和大数据环境。最后,"64bit"指明了这...

    ProjectEuler1-16代码

    【标题】"ProjectEuler1-16代码"所涉及的知识点主要集中在计算机编程和算法设计上,尤其针对初学者和编程爱好者。Project Euler是一个在线平台,它提供了一系列的数学和计算机科学问题,旨在通过解决这些问题来提升...

    openEuler for risc-v 2203进展与未来规划1

    openEuler RISC-V 版本计划是openEuler社区的一个重要组成部分,旨在为RISC-V架构提供长期支持,包括openEuler 20.03 LTS、openEuler 20.09、openEuler 21.03 内核创新版、openEuler 21.09创新版等。 openEuler ...

    GaussDB_T_1.0.2-EULER20SP8-ARM-64bit.tar.gz

    GaussDB是华为自主研发的一款高性能、高可用、高安全性的分布式数据库系统,专注于在线事务处理(OLTP)场景。在本版本"1.0.2-EULER20SP8-ARM-64bit"中,它特别针对ARM架构进行了优化,意味着这款数据库系统现在能够...

    Project-Euler-Problem-8

    【标题】"Project-Euler-Problem-8"是著名的编程挑战网站Project Euler中的一个问题,它旨在测试编程者解决数学和算法问题的能力。该问题通常涉及数值计算、数学优化或者组合数学,鼓励程序员用创新的方式解决问题。...

    Project-Euler-Problem-1:实践

    【标题】"Project-Euler-Problem-1:实践" 是一个关于解决Project Euler中的第一个问题的编程挑战。Project Euler是一个著名的在线系列数学与计算机科学问题,旨在鼓励学习者通过编程来解决问题并提升技能。问题1涉及...

    project-euler-problem-downloader:将所有 projecteuler.net 问题下载到您的本地存储

    而"project-euler-problem-downloader"是一个实用工具,它允许用户将Project Euler的所有问题下载到本地,以便离线浏览和解决。这个工具特别适合那些经常在没有网络连接或者希望通过本地编辑器解决Project Euler问题...

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd.part2.rar

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd文件分割成 五个 压缩包,必须集齐 五个 文件后才能一起解压一起使用: EulerOS-V2.0SP5-x86_64-dvd.part5.rar ... EulerOS-V2.0SP5-x86_64-dvd.part4.rar ...

    下载Project Euler题目

    标题 "下载Project Euler题目" 暗示了这个压缩包可能包含了与解决Project Euler问题相关的Java源代码。Project Euler是一个在线平台,提供了大量的数学和计算机科学问题,旨在提高编程技能和数学理解。这些问题通常...

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd.part1.rar

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd文件分割成 五个 压缩包,必须集齐 五个 文件后才能一起解压一起使用: EulerOS-V2.0SP5-x86_64-dvd.part5.rar ... EulerOS-V2.0SP5-x86_64-dvd.part4.rar ...

    openEuler-22.03-LTS-SP3-x86-64-dvd.zip.003

    openEuler 22.03(openEuler-22.03-LTS-SP3-x86-64-dvd.iso)适用于Linux x86-64系统,文件使用360压缩软件分割成4个压缩包,必须一起下载使用: part1: ...

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd.part5.rar

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd文件分割成 五个 压缩包,必须集齐 五个 文件后才能一起解压一起使用: EulerOS-V2.0SP5-x86_64-dvd.part5.rar ... EulerOS-V2.0SP5-x86_64-dvd.part4.rar ...

    Project-Euler-Problem-2:实践

    【标题】"Project-Euler-Problem-2:实践"涉及的是一个编程挑战,来源于著名的Project Euler网站,旨在通过解决数学和计算机科学问题来提升技能。本问题关注的是偶数斐波那契数列。 【描述】"#Project Euler 问题 2 ...

    ----euler code---.rar_Euler_euler number

    欧拉数(Euler Number)是数学中一个重要的常数,以其发现者莱昂哈德·欧拉(Leonhard Euler)的名字命名。欧拉数通常表示为'e',其数值约等于2.71828,是一个无理数且超越数。在数学的多个分支中,欧拉数都有广泛的...

    openEuler-competition/National-Innovation-2021

    openEuler-competition/National-Innovation-2021openEuler-competition/National-Innovation-2021openEuler-competition/National-Innovation-2021openEuler-competition/National-Innovation-2021openEuler-...

    RKDG-Euler-third-order-2d-accurary.f90

    RKDG-Euler-third-order-2d-accurary.f90

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd.part4.rar

    华为欧拉系统 EulerOS-V2.0SP5-x86_64-dvd文件分割成 五个 压缩包,必须集齐 五个 文件后才能一起解压一起使用: EulerOS-V2.0SP5-x86_64-dvd.part5.rar ... EulerOS-V2.0SP5-x86_64-dvd.part4.rar ...

Global site tag (gtag.js) - Google Analytics