Jump to content

Humble numbers: Difference between revisions

m (used an HTML code instead of "≥".)
Line 618:
Digits: 49 - Count: 240590
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}}==
7,820

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.