Taxicab numbers: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎{{header|REXX}}: added the extra-credit taxicab numbers.)
(→‎{{header|REXX}}: corrected a logic flaw in the REXX program.)
Line 72: Line 72:


=={{header|REXX}}==
=={{header|REXX}}==
<lang rexx>/*REXX program displays the first N (lowest) taxicab numbers. */
<lang rexx>/*REXX program displays the first (lowest) taxicab numbers. */
parse arg N L1 H1 L2 H2 . /*obtain the optional numbers. */
parse arg L1 H1 L2 H2 . /*obtain the optional numbers. */
if N=='' | N==',' then N=25 /*N given? Then use the default.*/
if L1=='' | L1==',' then L1=1 /*L1 " " " " " */
if L1=='' | L1==',' then L1=1 /*L1 " " " " " */
if H1=='' | H1==',' then H1=N /*H1 " " " " " */
if H1=='' | H1==',' then H1=25 /*H1 " " " " " */
if L2=='' | L2==',' then L2=4000 /*L2 " " " " " */
if L2=='' | L2==',' then L2=4000 /*L2 " " " " " */
if H2=='' | H2==',' then H2=4007 /*H2 " " " " " */
if H2=='' | H2==',' then H2=4007 /*H2 " " " " " */
Line 87: Line 86:
jjj=j**3 /*might as well calculate a cube.*/
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. */
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*/
if @.s==0 then do /*if cube not defined, then do it*/
@.s = "────►"right(j,6,b)t"■■■+"right(k,6,b)t
@.s = "────►"right(j,6,b)t"■■■+"right(k,6,b)t
Line 94: Line 94:
@.s=@.s","right(j,9,b)t"■■■+"right(k,6,b)t /*build the text.*/
@.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. */
$.s=right(s,15,b)'■■■'@.s /*define the rest of taxicab #s. */
leave /*leave the DO K loop. */
$=$ z /*define a #. taxicab number.*/
zz=words($) /*count the number of taxicab #s.*/
end /*k*/ /* [↑] build cubes one-at-a-time*/
end /*k*/ /* [↑] build cubes one-at-a-time*/
$=$ z /*define a #. taxicab number.*/
zz=words($) /*count the number of taxicab #s.*/
end /*j*/ /* [↑] complete with overage #s.*/
end /*j*/ /* [↑] complete with overage #s.*/
/*sort sub builds array, sorts it*/
/*sort sub builds array, sorts it*/
Line 119: Line 118:
'''output''' &nbsp; using the default input:
'''output''' &nbsp; using the default input:
<pre>
<pre>
1 1729 10**3 + 9**3, 12**3 + 1**3
1 1729 ────► 10**3 + 9**3, 12**3 + 1**3
2 4104 15**3 + 9**3, 16**3 + 2**3
2 4104 ────► 15**3 + 9**3, 16**3 + 2**3
3 13832 20**3 + 18**3, 24**3 + 2**3
3 13832 ────► 20**3 + 18**3, 24**3 + 2**3
4 32832 30**3 + 18**3, 32**3 + 4**3
4 20683 ────► 24**3 + 19**3, 27**3 + 10**3
5 39312 33**3 + 15**3, 34**3 + 2**3
5 32832 ────► 30**3 + 18**3, 32**3 + 4**3
6 46683 30**3 + 27**3, 36**3 + 3**3
6 39312 ────► 33**3 + 15**3, 34**3 + 2**3
7 65728 33**3 + 31**3, 40**3 + 12**3
7 40033 ────► 33**3 + 16**3, 34**3 + 9**3
8 110808 45**3 + 27**3, 48**3 + 6**3
8 46683 ────► 30**3 + 27**3, 36**3 + 3**3
9 134379 43**3 + 38**3, 51**3 + 12**3
9 64232 ────► 36**3 + 26**3, 39**3 + 17**3
10 149389 50**3 + 29**3, 53**3 + 8**3
10 65728 ────► 33**3 + 31**3, 40**3 + 12**3
11 171288 54**3 + 24**3, 55**3 + 17**3
11 110656 ────► 40**3 + 36**3, 48**3 + 4**3
12 195841 57**3 + 22**3, 58**3 + 9**3
12 110808 ────► 45**3 + 27**3, 48**3 + 6**3
13 216027 59**3 + 22**3, 60**3 + 3**3
13 134379 ────► 43**3 + 38**3, 51**3 + 12**3
14 314496 66**3 + 30**3, 68**3 + 4**3
14 149389 ────► 50**3 + 29**3, 53**3 + 8**3
15 402597 61**3 + 56**3, 69**3 + 42**3
15 165464 ────► 48**3 + 38**3, 54**3 + 20**3
16 443889 73**3 + 38**3, 76**3 + 17**3
16 171288 ────► 54**3 + 24**3, 55**3 + 17**3
17 513000 75**3 + 45**3, 80**3 + 10**3
17 195841 ────► 57**3 + 22**3, 58**3 + 9**3
18 513856 72**3 + 52**3, 78**3 + 34**3
18 216027 ────► 59**3 + 22**3, 60**3 + 3**3
19 558441 72**3 + 57**3, 81**3 + 30**3
19 216125 ────► 50**3 + 45**3, 60**3 + 5**3
20 593047 70**3 + 63**3, 84**3 + 7**3
20 262656 ────► 60**3 + 36**3, 64**3 + 8**3
21 684019 75**3 + 64**3, 82**3 + 51**3
21 314496 ────► 66**3 + 30**3, 68**3 + 4**3
22 704977 86**3 + 41**3, 89**3 + 2**3
22 320264 ────► 66**3 + 32**3, 68**3 + 18**3
23 805688 92**3 + 30**3, 93**3 + 11**3
23 327763 ────► 58**3 + 51**3, 67**3 + 30**3
24 886464 90**3 + 54**3, 96**3 + 12**3
24 373464 ────► 60**3 + 54**3, 72**3 + 6**3
25 984067 92**3 + 59**3, 98**3 + 35**3
25 402597 ────► 61**3 + 56**3, 69**3 + 42**3


4000 365841702037 5806**3 + 5541**3, 6274**3 + 4917**3
4000 365841702037 5806**3 + 5541**3, 6274**3 + 4917**3

Revision as of 06:02, 14 March 2014

Template:Draft

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 4,000th taxicab number + a half dozen more (extra credit)).

See also



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. */

  1. =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