project euler 64

Problem 64


Odd period square roots

All square roots are periodic when written as continued fractions and can be written in the form:

N=a0+1a1+1a2+1a3+

For example, let us consider √23:

23=4+234=4+11234=4+11+2337

If we continue we would get the following expansion:

N=4+11+13+11+18+

The process can be summarised as follows:

a0=41234=23+47=1+2337

a1=17233=7(23+3)14=3+2332

a2=22233=2(23+3)14=1+2347

a3=17234=7(23+4)7=8+234

a4=81234=23+47=1+2337

a5=17233=7(23+3)14=3+2332

a6=32233=2(23+3)14=1+2347

a7=17234=7(23+4)7=8+234

It can be seen that the sequence is repeating. For conciseness, we use the notation √23 = [4;(1,3,1,8)], to indicate that the block (1,3,1,8) repeats indefinitely.

The first ten continued fraction representations of (irrational) square roots are:

√2=[1;(2)], period=1
√3=[1;(1,2)], period=2
√5=[2;(4)], period=1
√6=[2;(2,4)], period=2
√7=[2;(1,1,1,4)], period=4
√8=[2;(1,4)], period=2
√10=[3;(6)], period=1
√11=[3;(3,6)], period=2
√12= [3;(2,6)], period=2
√13=[3;(1,1,1,1,6)], period=5

Exactly four continued fractions, for N ≤ 13, have an odd period.

How many continued fractions for N ≤ 10000 have an odd period?


奇周期平方根

所有的平方根写成如下连分数表示时都是周期性重复的:

N=a0+1a1+1a2+1a3+

例如,让我们考虑√23:

23=4+234=4+11234=4+11+2337

如果我们继续这个过程,我们会得到如下的展开:

N=4+11+13+11+18+

这个过程可以总结如下:

a0=41234=23+47=1+2337

a1=17233=7(23+3)14=3+2332

a2=22233=2(23+3)14=1+2347

a3=17234=7(23+4)7=8+234

a4=81234=23+47=1+2337

a5=17233=7(23+3)14=3+2332

a6=32233=2(23+3)14=1+2347

a7=17234=7(23+4)7=8+234

可以看出序列正在重复。我们将其简记为√23 = [4;(1,3,1,8)],表示在此之后(1,3,1,8)无限循环。

前10个(无理数)平方根的连分数表示是:

√2=[1;(2)],周期=1
√3=[1;(1,2)],周期=2
√5=[2;(4)],周期=1
√6=[2;(2,4)],周期=2
√7=[2;(1,1,1,4)],周期=4
√8=[2;(1,4)],周期=2
√10=[3;(6)],周期=1
√11=[3;(3,6)],周期=2
√12= [3;(2,6)],周期=2
√13=[3;(1,1,1,1,6)],周期=5

在N ≤ 13中,恰好有4个连分数表示的周期是奇数。

在N ≤ 10000中,有多少个连分数表示的周期是奇数?

package cuppics;

import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

public class Prj64 extends TestCase {

	public void testOddPeriodSquareRoots() {

		int count = 0;
		for (int i = 2; i <= 10000; i++) {
			List<Integer> data = getCircle(i);
			if( data.size() % 2 == 1){
				count ++;
			}
		}
		
		String fstr = "numOf odd period=%d" ;
		fstr = String.format(fstr, count);
		System.out.println(fstr);
	}

	/**
	 * https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#
	 * Continued_fraction_expansion
	 */
	public List<Integer> getCircle(int S) {

		int val = (int) Math.sqrt(S);
		//square
		if (val * val == S) {
			return new ArrayList<Integer>();
		}

		List<Integer> ret = new ArrayList<Integer>();

		int m0 = 0;
		int d0 = 1;
		int a0 = (int) Math.floor(Math.sqrt(S));
		int _a0 = a0;

		int mn = 0;
		int dn = 0;
		int an = 0;
		while (true) {
			mn = d0 * a0 - m0;
			dn = (S - mn * mn) / d0;
			an = (int) Math.floor((_a0 + mn) / dn);

			m0 = mn;
			d0 = dn;
			a0 = an;
			ret.add(a0);
			if (an == 2 * _a0) {
				break;
			}
		}
		return ret;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值