[seqfan] Re: Fw: NEW SEQ A164772

David Wilson dwilson at gambitcomm.com
Fri Aug 28 17:54:43 CEST 2009


One thing you might consider:

Let n^2 have d digits.

Then sod(n^2) = 8d.

This gives

sod(n^2) == 8d (mod 9)

which is to say

n^2 == 8d (mod 9)

This means you only have to check the following combinations of d and n:

d mod 9   n mod 9

0         0,3,6
2         4,5
5         2,7
8         1,8

This will reduce your work by a factor of 9.

There is another way to further reduce your work considerably, I call it 
the "skipping method", but it is difficult to program.

// Print all elements (squares) with d digits
sub print(int d) {

	// If we know d has no solution, quit
	if (d mod 9 !== 0, 2, 5 or 8) return;

	// Let S be the set of squares
	// Let T be the set of numbers with digit sum 8d
	// We want the intersection of these sets

	// While x is a d-digit number
	for (x = 10^(d-1); x < 10^d; ) {

		// Set y to the smallest element of S >= x (next square)
		y = ceil(sqrt(x))^2;

		// Set x to smallest element of T >= x
		x = T_elem_ge(y);

		// If these match
		if (x == y) {

			// We have found a suitable square
			print sqrt(x);

			// Continue search at x+1		
			x = x+1;
		}
	}
}

The difficult but rewarding part is T_elem_ge(x), which gives the next 
number >= x with d digits and digit sum 8d. It is an interesting 
exercise to work out a quick way to implement this function, which I 
tell you now is possible. Once you have done this, your search can skip 
over large intervals of irrelevant numbers.

David Radcliffe wrote:
> (Re: Numbers n such that the average digit of n^2 is 8.)
> 
> I continued the search until 10^10 and found eight more terms. Here is
> the complete list so far. Are there any patterns evident?
> 
> 313,298327,9893887,197483417,282753937,314623583,315432874,
> 706399164,773303937,894303633,947047833,948675387,989938887,994987437,998398167
> 8882454614,8888194417,8943142063,9374913167,9416989417,9476286187,9949260676,9949823114
> 
> I am using a Python program for the search, and I have three
> strategies to speed up the calculations.
> 1. Squares are generated by keeping a running total of consecutive odd numbers.
> 2. The digital sums of all numbers less than 10^6 are stored in a
> lookup table. Repeated division by 10^6 is used to find the digital
> sum of a larger number.
> 3. I am actually checking whether the digital sum of (10^d - 1 - k^2)
> is equal to d, where d is the number of digits in k^2. The loop is
> aborted when the sum of digits exceeds d.
> 
> I would be interested in other ideas to accelerate the search, other
> than switching to C++. Here is my Python code.
> 
> k = 10104041174   # Starting value for search. Change to k=1 to start
> at the beginning.
> 
> pow10 = 10
> N = k**2
> digits = 1
> while pow10 <= N:
>     pow10 *= 10
>     digits += 1
> n = pow10 - 1 - N
> step = 2*k+1
> 
> block = 1000000
> import scipy
> digitsums = scipy.zeros(block,int)
> for i in xrange(1,block):
>     digitsums[i] = digitsums[i/10] + (i % 10)
> 
> while 1:
>     if n < 0:
>         pow10 *= 10
>         digits += 1
>         n = pow10 - 1 - k*k
>         print "digits = %d" % (digits)
>     m = n
>     s = 0
>     while m>0:
>         s += digitsums[m % block]
>         if s > digits:
>             break
>         m /= block
>     else:
>         if s == digits:
>             print k
>     k += 1
>     n -= step
>     step += 2
> 
> 
> _______________________________________________
> 
> Seqfan Mailing list - http://list.seqfan.eu/
> 
> 





More information about the SeqFan mailing list