

Charles Babbage, looking ahead to the sorts of problems his Analytical Engine would be able to solve, gave this example:

 What is the smallest positive integer whose square ends in the digits 269,696?

— Babbage, letter to Lord Bowden, 1837; see Hollingdale and Tootill, Electronic Computers, second edition, 1970, p. 125.

He thought the answer might be 99,736, whose square is 9,947,269,696; but he couldn't be certain.



Task[edit]
The task is to find out if Babbage had the right answer — and to do so, as far as your language allows it, in code that Babbage himself would have been able to read and understand.
As Babbage evidently solved the task with pencil and paper, a similar efficient solution is preferred.

For these purposes, Charles Babbage may be taken to be an intelligent person, familiar with mathematics and with the idea of a computer; he has written the first drafts of simple computer programmes in tabular form. [Babbage Archive Series L].



Motivation
The aim of the task is to write a program that is sufficiently clear and well-documented for such a person to be able to read it and be confident that it does indeed solve the specified problem.




 
/* Babbage might have used a difference engine to compute squares.         */
/* The algorithm used here uses only additions to form successive squares. */
/* Since there is no guarantee that the final square will not exceed a     */
/* 32-bit integer word, modulus is formed to limit the magnitude of the    */
/* squares, since we are really interested only in the last six digits of  */
/* the square.                                                             */
 
Babbage_problem: procedure options (main);  /* R. Vowels, 19 Dec. 2021 */
   declare n fixed decimal (5);
   declare (odd, sq) fixed binary (31);
 
   odd = 3; sq = 4;         /* the initial square is 4 */
 
   do n = 3 to 99736;
      odd = odd + 2;
      sq = sq + odd;        /* form the next square */
      if sq >= 1000000 then sq = sq - 1000000; /* keep the remainder */
      if sq = 269696 then leave;
   end;
   put ('The smallest number whose square ends in 269696 is ' || trim(n) );
   put skip list ('The corresponding square is ' || trim (n*n) );
      /* Even if the number had been 99736, n*n would not have overflowed */
      /* because decimal arithmetic allows up to 15 decimal digits.       */
end Babbage_problem;
 