Taxicab numbers
definition
A taxicab number (the definition that is being used here) is a positive integer that can be expressed as the sum of two positive cubes in more than one way.
The first taxicab number is 1729, which is:
- 13 + 123 and
- 93 + 103.
Taxicab numbers are also known as:
- taxi numbers
- taxicab numbers
- taxi cab numbers
- Hardy-Ramanujan numbers
task requirements
The task requirements are:
- compute the lowest 25 taxicab numbers.
- exactly 25 taxicab numbers are to be shown (in numeric order).
- show the taxicab numbers as well as its constituent cubes.
- show all numbers in a very readable (aligned) format.
- show the 2,000th taxicab number + a half dozen more (extra credit)).
See also
- Sequence A001235 taxicab numbers on The On-Line Encyclopedia of Integer Sequences.
- Entry Hardy-Ramanujan Number on The Eric Weisstein's World of Mathematics (TM).
- Entry taxicab number on The Eric Weisstein's World of Mathematics (TM).
- Wiki entry Hardy-Ramanujan number.
J
<lang J> 25 {. ;({."#. <@(0&#`{.@.(1<#))/. ])/:~~.,/(+,/:~@,)"0/~3^~1+i.100
1729 1 1728 4104 8 4096 13832 8 13824 20683 1000 19683 32832 64 32768 39312 8 39304 40033 729 39304 46683 27 46656 64232 4913 59319 65728 1728 64000
110656 64 110592 110808 216 110592 134379 1728 132651 149389 512 148877 165464 8000 157464 171288 4913 166375 195841 729 195112 216027 27 216000 216125 125 216000 262656 512 262144 314496 64 314432 320264 5832 314432 327763 27000 300763 373464 216 373248 402597 74088 328509</lang>
Explanation:
First, generate 100 cubes.
Then, form a 3 column table of unique rows: sum, small cube, large cube
Then, gather rows where the first entry is the same. Keep the ones with at least two such entries.
Note that the cube root of the 25th entry is slightly smaller than 74, so testing against the first 100 cubes is more than sufficient.
REXX
<lang rexx>/*REXX program displays the first (lowest) taxicab numbers. */ parse arg L1 H1 L2 H2 . /*obtain the optional numbers. */ if L1== | L1==',' then L1=1 /*L1 " " " " " */ if H1== | H1==',' then H1=25 /*H1 " " " " " */ if L2== | L2==',' then L2=4000 /*L2 " " " " " */ if H2== | H2==',' then H2=4007 /*H2 " " " " " */ mx=max(L1, H1, L2, H2) /*find how many taxicab #s needed*/ w=length(mx) /*width is used formatting output*/ numeric digits 20 /*prepare to use larger numbers. */
- =0; @.=0; $.=; $=; b='■'; t='**3' /*initialize some REXX variables.*/
/* [↓] generate extra taxicab #s*/ do j=1 until zz==mx /*taxicab nums won't be in order.*/ jjj=j**3 /*might as well calculate a cube.*/ z=; do k=1 for j-1; s=jjj+k**3 /*define a whole bunch of cubes. */
if @.s==0 then do /*if cube not defined, then do it*/ @.s = "────►"right(j,6,b)t"■■■+"right(k,6,b)t iterate /* ··· and then go and do another*/ end /* [↑] define one cube at a time.*/ z=s /*save cube for taxicab # list.*/ @.s=@.s","right(j,9,b)t"■■■+"right(k,6,b)t /*build the text.*/ $.s=right(s,15,b)'■■■'@.s /*define the rest of taxicab #s. */ $=$ z /*define a #. taxicab number.*/ zz=words($) /*count the number of taxicab #s.*/ end /*k*/ /* [↑] build cubes one-at-a-time*/ end /*j*/ /* [↑] complete with overage #s.*/ /*sort sub builds array, sorts it*/
list=esort(zz) /*sort taxicab nums, create list.*/
/* [↓] list N taxicab numbers.*/ do j=L1 to H1; _=word(list,j) /*get one taxicab num at a time. */ say right(j,w) translate($._,,b) /*display taxicab # (with blanks)*/ end /*j*/ /* [↑] ■ are translated to blanks*/
say
do j=L2 to H2; _=word(list,j) /*get one taxicab num at a time. */ say right(j,w) translate($._,,b) /*display taxicab # (with blanks)*/ end /*j*/ /* [↑] ■ are translated to blanks*/
exit /*stick a fork in it, we're done.*/ /*──────────────────────────────────ESORT subroutine────────────────────*/ esort: procedure expose #. $; parse arg N 1 h a
do j=1 for N; #.j=word($,j); end /*j*/ do while h>1; h=h%2; do i=1 for N-h; j=i; k=h+i do while #.k<#.j; t=#.j; #.j=#.k; #.k=t if h>=j then leave; j=j-h; k=k-h; end; end; end; do m=1 for N; a=a #.m; end /*m*/; return a</lang>
output using the default input:
1 1729 ────► 10**3 + 9**3, 12**3 + 1**3 2 4104 ────► 15**3 + 9**3, 16**3 + 2**3 3 13832 ────► 20**3 + 18**3, 24**3 + 2**3 4 20683 ────► 24**3 + 19**3, 27**3 + 10**3 5 32832 ────► 30**3 + 18**3, 32**3 + 4**3 6 39312 ────► 33**3 + 15**3, 34**3 + 2**3 7 40033 ────► 33**3 + 16**3, 34**3 + 9**3 8 46683 ────► 30**3 + 27**3, 36**3 + 3**3 9 64232 ────► 36**3 + 26**3, 39**3 + 17**3 10 65728 ────► 33**3 + 31**3, 40**3 + 12**3 11 110656 ────► 40**3 + 36**3, 48**3 + 4**3 12 110808 ────► 45**3 + 27**3, 48**3 + 6**3 13 134379 ────► 43**3 + 38**3, 51**3 + 12**3 14 149389 ────► 50**3 + 29**3, 53**3 + 8**3 15 165464 ────► 48**3 + 38**3, 54**3 + 20**3 16 171288 ────► 54**3 + 24**3, 55**3 + 17**3 17 195841 ────► 57**3 + 22**3, 58**3 + 9**3 18 216027 ────► 59**3 + 22**3, 60**3 + 3**3 19 216125 ────► 50**3 + 45**3, 60**3 + 5**3 20 262656 ────► 60**3 + 36**3, 64**3 + 8**3 21 314496 ────► 66**3 + 30**3, 68**3 + 4**3 22 320264 ────► 66**3 + 32**3, 68**3 + 18**3 23 327763 ────► 58**3 + 51**3, 67**3 + 30**3 24 373464 ────► 60**3 + 54**3, 72**3 + 6**3 25 402597 ────► 61**3 + 56**3, 69**3 + 42**3 4000 365841702037 5806**3 + 5541**3, 6274**3 + 4917**3 4001 381281044228 6137**3 + 5315**3, 6581**3 + 4583**3 4002 389845801000 6340**3 + 5130**3, 6555**3 + 4765**3 4003 403718156352 6244**3 + 5432**3, 6478**3 + 5090**3 4004 423414336247 6119**3 + 5792**3, 6230**3 + 5663**3 4005 435912538698 6353**3 + 5641**3, 6547**3 + 5375**3 4006 438857254017 6217**3 + 5834**3, 6462**3 + 5529**3 4007 476650386296 6353**3 + 6039**3, 6524**3 + 5838**3