June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -1,4 +1,4 @@
|
|||
CATALAN CSECT
|
||||
CATALAN CSECT 08/09/2015
|
||||
USING CATALAN,R15
|
||||
LA R7,1 c=1
|
||||
LA R6,1 i=1
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
FOR i% = 1 TO 15
|
||||
PRINT FNcatalan(i%)
|
||||
NEXT
|
||||
END
|
||||
|
||||
DEF FNcatalan(n%)
|
||||
IF n% = 0 THEN = 1
|
||||
= 2 * (2 * n% - 1) * FNcatalan(n% - 1) / (n% + 1)
|
||||
10 FOR i% = 1 TO 15
|
||||
20 PRINT FNcatalan(i%)
|
||||
30 NEXT
|
||||
40 END
|
||||
50 DEF FNcatalan(n%)
|
||||
60 IF n% = 0 THEN = 1
|
||||
70 = 2 * (2 * n% - 1) * FNcatalan(n% - 1) / (n% + 1)
|
||||
|
|
|
|||
|
|
@ -1 +1,4 @@
|
|||
Catalan(n::Integer) = div(binomial(2n, n), n+1)
|
||||
catalannum(n::Integer) = binomial(2n, n) ÷ (n + 1)
|
||||
|
||||
@show catalannum.(1:15)
|
||||
@show catalannum(big(100))
|
||||
|
|
|
|||
11
Task/Catalan-numbers/Logo/catalan-numbers.logo
Normal file
11
Task/Catalan-numbers/Logo/catalan-numbers.logo
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
to factorial :n
|
||||
output ifelse [less? :n 1] 1 [product :n factorial difference :n 1]
|
||||
end
|
||||
to choose :n :r
|
||||
output quotient factorial :n product factorial :r factorial difference :n :r
|
||||
end
|
||||
to catalan :n
|
||||
output product (quotient sum :n 1) choose product 2 :n :n
|
||||
end
|
||||
|
||||
repeat 15 [print catalan repcount]
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
function n = catalanNumbers(n)
|
||||
function n = catalanNumber(n)
|
||||
for i = (1:length(n))
|
||||
n(i) = (1/(n(i)+1))*nchoosek(2*n(i),n(i));
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
function n = catalanNumbers(n)
|
||||
n = arrayfun(@(n)prod(n+1:2*n)/prod(1:n+1), n);
|
||||
n = [1 cumprod((2:4:4*n-6) ./ (2:n))];
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
>> catalanNumbers(14)
|
||||
>> catalanNumber(14)
|
||||
|
||||
ans =
|
||||
|
||||
2674440
|
||||
|
||||
>> catalanNumbers((0:17))'
|
||||
>> catalanNumbers(18)'
|
||||
|
||||
ans =
|
||||
|
||||
|
|
|
|||
65
Task/Catalan-numbers/Modula-2/catalan-numbers.mod2
Normal file
65
Task/Catalan-numbers/Modula-2/catalan-numbers.mod2
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
MODULE CatalanNumbers;
|
||||
FROM FormatString IMPORT FormatString;
|
||||
FROM Terminal IMPORT WriteString,WriteLn,ReadChar;
|
||||
|
||||
PROCEDURE binomial(m,n : LONGCARD) : LONGCARD;
|
||||
VAR r,d : LONGCARD;
|
||||
BEGIN
|
||||
r := 1;
|
||||
d := m - n;
|
||||
IF d>n THEN
|
||||
n := d;
|
||||
d := m - n;
|
||||
END;
|
||||
WHILE m>n DO
|
||||
r := r * m;
|
||||
DEC(m);
|
||||
WHILE (d>1) AND NOT (r MOD d # 0) DO
|
||||
r := r DIV d;
|
||||
DEC(d)
|
||||
END
|
||||
END;
|
||||
RETURN r
|
||||
END binomial;
|
||||
|
||||
PROCEDURE catalan1(n : LONGCARD) : LONGCARD;
|
||||
BEGIN
|
||||
RETURN binomial(2*n,n) DIV (1+n)
|
||||
END catalan1;
|
||||
|
||||
PROCEDURE catalan2(n : LONGCARD) : LONGCARD;
|
||||
VAR i,sum : LONGCARD;
|
||||
BEGIN
|
||||
IF n>1 THEN
|
||||
sum := 0;
|
||||
FOR i:=0 TO n-1 DO
|
||||
sum := sum + catalan2(i) * catalan2(n - 1 - i)
|
||||
END;
|
||||
RETURN sum
|
||||
ELSE
|
||||
RETURN 1
|
||||
END
|
||||
END catalan2;
|
||||
|
||||
PROCEDURE catalan3(n : LONGCARD) : LONGCARD;
|
||||
BEGIN
|
||||
IF n#0 THEN
|
||||
RETURN 2 *(2 * n - 1) * catalan3(n - 1) DIV (1 + n)
|
||||
ELSE
|
||||
RETURN 1
|
||||
END
|
||||
END catalan3;
|
||||
|
||||
VAR
|
||||
blah : LONGCARD = 123;
|
||||
buf : ARRAY[0..63] OF CHAR;
|
||||
i : LONGCARD;
|
||||
BEGIN
|
||||
FormatString("\tdirect\tsumming\tfrac\n", buf);
|
||||
WriteString(buf);
|
||||
FOR i:=0 TO 15 DO
|
||||
FormatString("%u\t%u\t%u\t%u\n", buf, i, catalan1(i), catalan2(i), catalan3(i));
|
||||
WriteString(buf)
|
||||
END;
|
||||
ReadChar
|
||||
END CatalanNumbers.
|
||||
|
|
@ -1,12 +1,54 @@
|
|||
let catalan : int ref = ref 0 in
|
||||
Printf.printf "%d ," 1 ;
|
||||
for i = 2 to 9 do
|
||||
let nm : int ref = ref 1 in
|
||||
let den : int ref = ref 1 in
|
||||
for k = 2 to i do
|
||||
nm := (!nm)*(i+k);
|
||||
den := (!den)*k;
|
||||
catalan := (!nm)/(!den) ;
|
||||
done;
|
||||
print_int (!catalan); print_string "," ;
|
||||
done;;
|
||||
let imp_catalan n =
|
||||
let return = ref 1 in
|
||||
for i = 1 to n do
|
||||
return := !return * 2 * (2 * i - 1) / (i + 1)
|
||||
done;
|
||||
!return
|
||||
|
||||
let rec catalan = function
|
||||
| 0 -> 1
|
||||
| n -> catalan (n - 1) * 2 * (2 * n - 1) / (n + 1)
|
||||
|
||||
let memoize f =
|
||||
let cache = Hashtbl.create 20 in
|
||||
fun n ->
|
||||
match Hashtbl.find_opt cache n with
|
||||
| None ->
|
||||
let x = f n in
|
||||
Hashtbl.replace cache n x;
|
||||
x
|
||||
| Some x -> x
|
||||
|
||||
let catalan_cache = Hashtbl.create 20
|
||||
|
||||
let rec memo_catalan n =
|
||||
if n = 0 then 1 else
|
||||
match Hashtbl.find_opt catalan_cache n with
|
||||
| None ->
|
||||
let x = memo_catalan (n - 1) * 2 * (2 * n - 1) / (n + 1) in
|
||||
Hashtbl.replace catalan_cache n x;
|
||||
x
|
||||
| Some x -> x
|
||||
|
||||
let () =
|
||||
if not !Sys.interactive then
|
||||
let bench label f n times =
|
||||
let start = Unix.gettimeofday () in
|
||||
begin
|
||||
for i = 1 to times do f n done;
|
||||
let stop = Unix.gettimeofday () in
|
||||
Printf.printf "%s (%d runs) : %.3f\n"
|
||||
label times (stop -. start)
|
||||
end in
|
||||
let show f g h f' n =
|
||||
for i = 0 to n do
|
||||
Printf.printf "%2d %7d %7d %7d %7d\n"
|
||||
i (f i) (g i) (h i) (f' i)
|
||||
done
|
||||
in
|
||||
List.iter (fun (l, f) -> bench l f 15 10_000_000)
|
||||
["imperative", imp_catalan;
|
||||
"recursive", catalan;
|
||||
"hand-memoized", memo_catalan;
|
||||
"memoized", (memoize catalan)];
|
||||
show imp_catalan catalan memo_catalan (memoize catalan) 15
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
: catalan(n) n ifZero: [ 1 ] else: [ catalan(n 1-) 2 n * 1- * 2 * n 1+ / ] ;
|
||||
: catalan( n -- m )
|
||||
n ifZero: [ 1 ] else: [ catalan( n 1- ) 2 n * 1- * 2 * n 1+ / ] ;
|
||||
|
|
|
|||
|
|
@ -1 +1,5 @@
|
|||
constant Catalan = 1, |[\*] (2, 6 ... *) Z/ 2 .. *;
|
||||
|
||||
|
||||
# In both cases, the sixteen first values can be seen with:
|
||||
.say for Catalan[^16];
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
catalan <- function(n) choose(2*n, n)/(n + 1)
|
||||
catalan(1:15)
|
||||
# [1] 1 2 5 14 42 132 429 1430 4862
|
||||
#[10] 16796 58786 208012 742900 2674440 9694845
|
||||
catalan(0:15)
|
||||
[1] 1 1 2 5 14 42 132 429 1430
|
||||
[10] 4862 16796 58786 208012 742900 2674440 9694845
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ object Catalan {
|
|||
def catalan(n: BigInt) = factorial(2 * n) / (factorial(n + 1) * factorial(n))
|
||||
|
||||
def main(args: Array[String]) {
|
||||
for (n <- 1 to 15) {
|
||||
for (n <- 0 to 15) {
|
||||
println("catalan(" + n + ") = " + catalan(n))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
5
Task/Catalan-numbers/Stata/catalan-numbers.stata
Normal file
5
Task/Catalan-numbers/Stata/catalan-numbers.stata
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
clear
|
||||
set obs 15
|
||||
gen catalan=1 in 1
|
||||
replace catalan=catalan[_n-1]*2*(2*_n-3)/_n in 2/l
|
||||
list, noobs noh
|
||||
Loading…
Add table
Add a link
Reference in a new issue