Humble numbers: Difference between revisions
Content added Content deleted
m (used an HTML code instead of "≥".) |
|||
Line 618: | Line 618: | ||
Digits: 49 - Count: 240590 |
Digits: 49 - Count: 240590 |
||
Digits: 50 - Count: 255415</pre> |
Digits: 50 - Count: 255415</pre> |
||
=={{header|Phix}}== |
|||
{{libheader|mpfr}} |
|||
{{trans|Julia}} |
|||
I felt pretty good about the performance of this, until I ran the Go version - humbled indeed!<br> |
|||
It will go all the way to 100 digits if you give it time (18 mins, on 64bit - 32bit runs out of memory after printing the 99th line)<br> |
|||
I also tried a log version (similar to [[Hamming_numbers#Phix]]) but inaccuracies crept in quite early, at just 10 digits. |
|||
<lang Phix>-- demo/rosetta/humble.exw |
|||
include mpfr.e |
|||
procedure humble(integer n, bool countdigits=false) |
|||
-- if countdigits is false: show first n humble numbers, |
|||
-- if countdigits is true: count them up to n digits. |
|||
sequence humble = {mpz_init(1)}, |
|||
nexts = {2,3,5,7}, |
|||
indices = repeat(1,4) |
|||
for i=1 to 4 do nexts[i] = mpz_init(nexts[i]) end for |
|||
integer digits = 1, |
|||
count = 1, |
|||
dead = 1, |
|||
tc = 0 |
|||
atom t0 = time() |
|||
mpz p10 = mpz_init(10) |
|||
while ((not countdigits) and length(humble)<n) |
|||
or (countdigits and digits<=n) do |
|||
mpz x = mpz_init_set(mpz_min(nexts)) |
|||
humble = append(humble,x) |
|||
if countdigits then |
|||
if mpz_cmp(x,p10)>=0 then |
|||
mpz_mul_si(p10,p10,10) |
|||
integer d = min(indices) |
|||
for k=dead to d-1 do |
|||
humble[k] = mpz_free(humble[k]) |
|||
end for |
|||
dead = d |
|||
string s = iff(digits=1?"":"s"), |
|||
e = elapsed(time()-t0) |
|||
tc += count |
|||
-- e &= sprintf(", %,d dead",{dead-1}) |
|||
e &= sprintf(", total:%,d",{tc}) |
|||
printf(1,"%,12d humble numbers have %d digit%s (%s)\n",{count,digits,s,e}) |
|||
digits += 1 |
|||
count = 1 |
|||
else |
|||
count += 1 |
|||
end if |
|||
end if |
|||
for j=1 to 4 do |
|||
if mpz_cmp(nexts[j],x)<=0 then |
|||
indices[j] += 1 |
|||
mpz_mul_si(nexts[j],humble[indices[j]],get_prime(j)) |
|||
end if |
|||
end for |
|||
end while |
|||
if not countdigits then |
|||
for i=1 to length(humble) do |
|||
humble[i] = shorten(mpz_get_str(humble[i]),ml:=10) |
|||
end for |
|||
printf(1,"First %d humble numbers: %s\n\n",{n,join(humble," ")}) |
|||
end if |
|||
end procedure |
|||
humble(50) |
|||
humble(42,true)</lang> |
|||
{{out}} |
|||
<pre> |
|||
First 50 humble numbers: 1 2 3 4 5 6 7 8 9 10 12 14 15 16 18 20 21 24 25 27 28 30 32 35 36 40 42 45 48 49 50 54 56 60 63 64 70 72 75 80 81 84 90 96 98 100 105 108 112 120 |
|||
9 humble numbers have 1 digit (0s, total:9) |
|||
36 humble numbers have 2 digits (0s, total:45) |
|||
95 humble numbers have 3 digits (0s, total:140) |
|||
197 humble numbers have 4 digits (0s, total:337) |
|||
356 humble numbers have 5 digits (0s, total:693) |
|||
579 humble numbers have 6 digits (0.0s, total:1,272) |
|||
882 humble numbers have 7 digits (0.0s, total:2,154) |
|||
1,272 humble numbers have 8 digits (0.0s, total:3,426) |
|||
1,767 humble numbers have 9 digits (0.1s, total:5,193) |
|||
2,381 humble numbers have 10 digits (0.1s, total:7,574) |
|||
3,113 humble numbers have 11 digits (0.2s, total:10,687) |
|||
3,984 humble numbers have 12 digits (0.2s, total:14,671) |
|||
5,002 humble numbers have 13 digits (0.3s, total:19,673) |
|||
6,187 humble numbers have 14 digits (0.4s, total:25,860) |
|||
7,545 humble numbers have 15 digits (0.5s, total:33,405) |
|||
9,081 humble numbers have 16 digits (0.6s, total:42,486) |
|||
10,815 humble numbers have 17 digits (0.8s, total:53,301) |
|||
12,759 humble numbers have 18 digits (0.9s, total:66,060) |
|||
14,927 humble numbers have 19 digits (1.2s, total:80,987) |
|||
17,323 humble numbers have 20 digits (1.4s, total:98,310) |
|||
19,960 humble numbers have 21 digits (1.7s, total:118,270) |
|||
22,853 humble numbers have 22 digits (2.0s, total:141,123) |
|||
26,015 humble numbers have 23 digits (2.3s, total:167,138) |
|||
29,458 humble numbers have 24 digits (2.7s, total:196,596) |
|||
33,188 humble numbers have 25 digits (3.2s, total:229,784) |
|||
37,222 humble numbers have 26 digits (3.7s, total:267,006) |
|||
41,568 humble numbers have 27 digits (4.3s, total:308,574) |
|||
46,245 humble numbers have 28 digits (5.0s, total:354,819) |
|||
51,254 humble numbers have 29 digits (5.7s, total:406,073) |
|||
56,618 humble numbers have 30 digits (6.5s, total:462,691) |
|||
62,338 humble numbers have 31 digits (7.3s, total:525,029) |
|||
68,437 humble numbers have 32 digits (8.3s, total:593,466) |
|||
74,917 humble numbers have 33 digits (9.4s, total:668,383) |
|||
81,793 humble numbers have 34 digits (10.5s, total:750,176) |
|||
89,083 humble numbers have 35 digits (11.7s, total:839,259) |
|||
96,786 humble numbers have 36 digits (13.1s, total:936,045) |
|||
104,926 humble numbers have 37 digits (14.6s, total:1,040,971) |
|||
113,511 humble numbers have 38 digits (16.2s, total:1,154,482) |
|||
122,546 humble numbers have 39 digits (17.9s, total:1,277,028) |
|||
132,054 humble numbers have 40 digits (19.7s, total:1,409,082) |
|||
142,038 humble numbers have 41 digits (21.7s, total:1,551,120) |
|||
152,515 humble numbers have 42 digits (23.9s, total:1,703,635) |
|||
</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |