Another update from ingydotnet^djgoku

This commit is contained in:
Ingy döt Net 2015-11-18 06:14:39 +00:00
parent 91df62d461
commit 948b86eafa
7604 changed files with 108452 additions and 22726 deletions

View file

@ -1,37 +1,36 @@
function fib(n:Int64):int64;
function fib(n: Int64): Int64;
type TFibMat = array[0..1] of array[0..1] of int64;
type TFibMat = array[0..1] of array[0..1] of Int64;
function FibMatMul(a,b:TFibMat):TFibMat;
var i,j,k:integer;
tmp:TFibMat;
begin
for i:=0 to 1 do
for j:=0 to 1 do
begin
tmp[i,j]:=0;
for k:=0 to 1 do tmp[i,j]:=tmp[i,j]+a[i,k]*b[k,j];
end;
FibMatMul:=tmp;
end;
function FibMatExp(a:TFibMat;n:int64):TFibmat;
begin
if n<=1 then fibmatexp:=a else
if (n mod 2 = 0) then FibMatExp:=FibMatExp(FibMatMul(a,a), n div 2) else
if (n mod 2 = 1) then FibMatExp:=FibMatMul(a,FibMatExp(FibMatMul(a,a),(n) div 2));
end;
function FibMatMul(a,b: TFibMat): TFibMat;
var i,j,k: integer;
tmp: TFibMat;
begin
for i := 0 to 1 do
for j := 0 to 1 do
begin
tmp[i,j] := 0;
for k := 0 to 1 do tmp[i,j] := tmp[i,j] + a[i,k] * b[k,j];
end;
FibMatMul := tmp;
end;
function FibMatExp(a: TFibMat; n: Int64): TFibmat;
begin
if n <= 1 then fibmatexp := a
else if (n mod 2 = 0) then FibMatExp := FibMatExp(FibMatMul(a,a), n div 2)
else if (n mod 2 = 1) then FibMatExp := FibMatMul(a, FibMatExp(FibMatMul(a,a), n div 2));
end;
var
matrix:TFibMat;
matrix: TFibMat;
begin
matrix[0,0]:=1;
matrix[0,1]:=1;
matrix[1,0]:=1;
matrix[1,1]:=0;
if n>1 then
matrix:=fibmatexp(matrix,n-1);
fib:=matrix[0,0];
matrix[0,0] := 1;
matrix[0,1] := 1;
matrix[1,0] := 1;
matrix[1,1] := 0;
if n > 1 then
matrix := fibmatexp(matrix,n-1);
fib := matrix[0,0];
end;

View file

@ -0,0 +1,13 @@
defmodule Fibonacci do
def fib(0), do: 0
def fib(1), do: 1
def fib(n), do: fib(0, 1, n-2)
def fib(_, prv, -1), do: prv
def fib(prvprv, prv, n) do
next = prv + prvprv
fib(prv, next, n-1)
end
end
IO.inspect Enum.map(0..10, fn i-> Fibonacci.fib(i) end)

View file

@ -0,0 +1 @@
Stream.unfold({0,1}, fn {a,b} -> {a,{b,a+b}} end) |> Enum.take(10)

View file

@ -0,0 +1,5 @@
(defun fib (n a b c)
(if (< c n) (fib n b (+ a b) (+ 1 c) )
(if (= c n) b a) ))
(defun fibonacci (n) (if (< n 2) n (fib n 0 1 1) ))

View file

@ -0,0 +1,10 @@
(defun fibonacci (n)
(let ( (vec) (i) (j) (k) )
(if (< n 2) n
(progn
(setq vec (make-vector (+ n 1) 0) i 0 j 1 k 2)
(setf (aref vec 1) 1)
(while (<= k n)
(setf (aref vec k) (+ (elt vec i) (elt vec j) ))
(setq i (+ 1 i) j (+ 1 j) k (+ 1 k) ))
(elt vec n) ))))

View file

@ -0,0 +1,3 @@
(insert
(mapconcat '(lambda (n) (format "%d" (fibonacci n) ))
(number-sequence 0 15) " ") )

View file

@ -1,3 +1,6 @@
fib(0) -> 0;
-module(fib).
-export([fib/1).
fib(0) -> 1;
fib(1) -> 1;
fib(N) when N > 1 -> fib(N-1) + fib(N-2).
fib(N) -> fib(N-1) + fib(N-2).

View file

@ -1,3 +1,12 @@
fib(N) -> fib(N,0,1).
fib(0,Res,_) -> Res;
fib(N,Res,Next) when N > 0 -> fib(N-1, Next, Res+Next).
-module(fiblin).
-export([fib/1])
fib(0) -> 0;
fib(1) -> 1;
fib(2) -> 1;
fib(3) -> 2;
fib(4) -> 3;
fib(5) -> 5;
fib(N) when is_integer(N) -> fib(N - 6, 5, 8).
fib(N, A, B) -> if N < 1 -> B; true -> fib(N-1, B, A+B) end.

View file

@ -0,0 +1 @@
io:write([fiblin:fib(X) || X <- lists:seq(1,10) ]).

View file

@ -1,14 +1,16 @@
# (fib n) = the nth Fibonacci number
\fib=
(
(@\loop\x\y\n
le n 0 x;
\z=(+ x y)
\n=(- n 1)
loop y z n
)
0 1
\loop==
(\x\y\n
le n 0 x;
\z=(+ x y)
\n=(- n 1)
loop y z n
)
loop 0 1
)
# Now test it:
for 0 20 (\n say (fib n))

View file

@ -0,0 +1,32 @@
package fibonacci
enum class Fibonacci {
ITERATIVE {
override fun invoke(n: Long) = if (n < 2 )
n
else {
var n1: Long = 0
var n2: Long = 1
var i = n
do {
val sum = n1 + n2
n1 = n2
n2 = sum
} while (i-- > 1)
n1
}
},
RECURSIVE {
override fun invoke(n: Long): Long = if (n < 2) n else this(n - 1) + this(n - 2)
};
abstract operator fun invoke(n: Long): Long
}
fun main(args: Array<String>) {
val r = 0..30L
Fibonacci.values() forEach {
print("\n${it.name()}: ")
r forEach { i -> print(" " + it(i)) }
}
}

View file

@ -1,8 +1,5 @@
(define (fibonacci n)
(let (a 0 b 1 c n i 2)
(while (<= i n)
(setq c (+ a b)
a b
b c)
(++ i))
c))
(let (L '(0 1))
(dotimes (i n)
(setq L (list (L 1) (apply + L))))
(L 1)) )

View file

@ -1,4 +1,4 @@
(define (fibonacci n)
(if (< n 2) 1
(+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
(print(fibonacci 10)) ;;89
(+ (fibonacci (- n 1))
(fibonacci (- n 2)))))

View file

@ -0,0 +1,7 @@
(define (fibonacci n)
(letn (f '((0 1) (1 1)) fib f)
(dotimes (i n)
(set 'fib (multiply fib f)))
(fib 0 1)) )
(print(fibonacci 10)) ;;89

View file

@ -3,3 +3,10 @@ let rec fib_rec n =
n
else
fib_rec (n - 1) + fib_rec (n - 2)
(* with support for negatives *)
let rec fib = function
0 -> 0
| 1 -> 1
| n -> if n > 0 then fib (n-1) + fib (n-2)
else fib (n+2) - fib (n+1)

View file

@ -5,3 +5,8 @@ let fib n =
| _ -> fib_aux (n-1) b (a+b)
in
fib_aux n 0 1
(* support for negatives *)
let fib n =
if n < 0 && n mod 2 = 0 then -fib (abs n)
else fib (abs n)

View file

@ -7,3 +7,13 @@ let fib =
| n -> fib_aux f1 (f1 +/ f0) (n - 1)
in
fib_aux (num_of_int 0) (num_of_int 1)
(* support for negatives *)
let fib n =
if n < 0 && n mod 2 = 0 then minus_num (fib (abs n))
else fib (abs n)
;;
(* It can be called from the command line with an argument *)
(* Result is send to standart output *)
let n = int_of_string Sys.argv.(1) in
print_endline (string_of_num (fib n))

View file

@ -1,10 +1,11 @@
open Num
let mul (a,b,c) (d,e,f) =
(a*/d +/ b*/e, a*/e +/ b*/f, b*/e +/ c*/f)
let mul (a,b,c) (d,e,f) = let bxe = b*/e in
(a*/d +/ bxe, a*/e +/ b*/f, bxe +/ c*/f)
let id = (Int 1, Int 0, Int 1)
let rec pow a n =
if n=1 then a else
if n=0 then id else
let b = pow a (n/2) in
if (n mod 2) = 0 then mul b b else mul a (mul b b)

View file

@ -1,6 +1 @@
sub fib (Int $n --> Int) {
$n > 1 or return $n;
my ($prev, $this) = 0, 1;
($prev, $this) = $this, $this + $prev for 1 ..^ $n;
return $this;
}
my constant @fib = 0, 1, *+* ... *;

View file

@ -1,4 +1 @@
proto fib (Int $n --> Int) is cached {*}
multi fib (0) { 0 }
multi fib (1) { 1 }
multi fib ($n) { fib($n - 1) + fib($n - 2) }
sub fib ($n) { @fib[$n] }

View file

@ -1,6 +1,2 @@
sub fib (Int $n --> Int) {
constant φ1 = 1 / constant φ = (1 + sqrt 5)/2;
constant invsqrt5 = 1 / sqrt 5;
floor invsqrt5 * (φ**$n + φ1**$n);
}
my constant @neg_fib = 0, 1, *-* ... *;
sub fib ($n) { $n >= 0 and @fib[$n] or @neg_fib[-$n]; }

View file

@ -1 +1,6 @@
my @fib := 0, 1, *+* ... *;
sub fib (Int $n --> Int) {
$n > 1 or return $n;
my ($prev, $this) = 0, 1;
($prev, $this) = $this, $this + $prev for 1 ..^ $n;
return $this;
}

View file

@ -1 +1,4 @@
sub fib ($n) { @fib[$n] }
proto fib (Int $n --> Int) is cached {*}
multi fib (0) { 0 }
multi fib (1) { 1 }
multi fib ($n) { fib($n - 1) + fib($n - 2) }

View file

@ -1,2 +1,6 @@
my @neg_fib := 0, 1, *-* ... *;
sub fib ($n) { $n >= 0 and @fib[$n] or @neg_fib[-$n]; }
sub fib (Int $n --> Int) {
constant φ1 = 1 / constant φ = (1 + sqrt 5)/2;
constant invsqrt5 = 1 / sqrt 5;
floor invsqrt5 * (φ**$n + φ1**$n);
}

View file

@ -1,6 +1,8 @@
def fib_iter(n)
return 0 if n == 0
fib_prev, fib = 1, 1
(n.abs - 2).times { fib_prev, fib = fib, fib + fib_prev }
fib * (n < 0 ? (-1)**(n + 1) : 1)
def fib(n, sequence=[1])
n.times do
current_number, last_number = sequence.last(2)
sequence << current_number + (last_number or 0)
end
sequence.last
end

View file

@ -1,9 +1,8 @@
def fib_rec(n)
if n <= -2
(-1)**(n + 1) * fib_rec(n.abs)
elsif n <= 1
n.abs
else
fib_rec(n - 1) + fib_rec(n - 2)
end
def fib(n, sequence=[1])
return sequence.last if n == 0
current_number, last_number = sequence.last(2)
sequence << current_number + (last_number or 0)
fib(n-1, sequence)
end

View file

@ -1,66 +1,30 @@
// Works with 0.13.0-dev (f673e9841)
fn fib<F>(n: i64, f: F) -> (i64, i64) where F: Fn(i64) {
if n < 0 {
// Let these variables be mutated, otherwise too slow
let mut n1:i64 = 0;
let mut n2:i64 = -1;
let mut i:i64 = 0;
let mut tmp:i64;
#![feature(zero_one)]
use std::num::One;
use std::ops::Add;
while i > n {
f(n1);
tmp = n1-n2;
if tmp > 0 && n2 > 0 { //Detect overflow
println!("\nReached the limit of i64, halting");
return (n1, i);
}
n1 = n2;
n2 = tmp;
i -= 1;
}
(n1+n2, n)
} else if n > 0 {
// And these variables
let mut n1:i64 = 0;
let mut n2:i64 = 1;
let mut i:i64 = 0;
let mut tmp:i64;
struct Fib<T> {
curr: T,
next: T,
}
while i < n {
f(n1);
tmp = n1+n2;
if tmp < 0 { //Detect overflow
println!("\nReached the limit of i64, halting");
return (n1, i);
}
n1 = n2;
n2 = tmp;
i += 1;
}
(n2-n1, n)
} else {
f(0);
(0,1)
impl<T> Fib<T> where T: One {
fn new() -> Self {
Fib {curr: T::one(), next: T::one()}
}
}
impl<T> Iterator for Fib<T> where T: Add<T, Output=T> + Copy {
type Item = T;
fn next(&mut self) -> Option<Self::Item>{
let new = self.curr + self.next;
self.curr = self.next;
self.next = new;
Some(self.curr)
}
}
fn main() {
let args = std::os::args();
let default_n = 10i64;
let n = match args.len() {
1 => default_n,
_ => args[1].parse().unwrap_or(default_n)
};
/* Use the loop protocol to be able to do things
* with the sequence given, in this case, print them out.
* The loop itself returns a tuple with where it got to and
* what the number is.
*/
let (result, n) = fib(n, |num| {
//print out the sequence
print!("{} ", num);
});
println!("\nThe {}th fibonacci number is: {}", n, result);
for i in Fib::<u64>::new() {
println!("{}", i);
}
}

View file

@ -1,7 +1,6 @@
// Works with 0.13.0-dev (f673e9841)
fn main() {
fn fib(n: int) -> int {
fn _fib(n: int, a: int, b: int) -> int {
fn fib(n: i32) -> i32 {
fn _fib(n: i32, a: i32, b: i32) -> i32 {
match (n, a, b) {
(0, _, _) => a,
_ => _fib(n-1, a+b, a)
@ -11,7 +10,7 @@ fn main() {
_fib(n, 0, 1)
}
for n in range(0, 20) {
for n in 0..20 {
println!("{}", fib(n));
}
}

View file

@ -0,0 +1,15 @@
$ Print out the first ten Fibonacci numbers
$ This uses Set Builder Notation, it roughly means
$ 'collect fib(n) forall n in {0,1,2,3,4,5,6,7,8,9,10}'
print({fib(n) : n in {0..10}});
$ Iterative Fibonacci function
proc fib(n);
A := 0; B := 1; C := n;
for i in {0..n} loop
C := A + B;
A := B;
B := C;
end loop;
return C;
end proc;

View file

@ -1,19 +1,10 @@
;;; Fibonacci numbers using Edsger Dijkstra's algorithm
;;; http://www.cs.utexas.edu/users/EWD/ewd06xx/EWD654.PDF
(define (fib)
(define (nxt lv nv) (cons nv (lambda () (nxt nv (+ lv nv)))))
(cons 0 (lambda () (nxt 0 1))))
(define (fib n)
(define (fib-aux a b p q count)
(cond ((= count 0) b)
((even? count)
(fib-aux a
b
(+ (* p p) (* q q))
(+ (* q q) (* 2 p q))
(/ count 2)))
(else
(fib-aux (+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p
q
(- count 1)))))
(fib-aux 1 0 0 1 n))
;;; test...
(define (show-stream-take n strm)
(define (shw-nxt n strm) (begin (display (car strm))
(if (> n 1) (begin (display " ") (shw-nxt (- n 1) ((cdr strm)))) (display ")"))))
(begin (display "(") (shw-nxt n strm)))
(show-stream-take 30 (fib))

View file

@ -0,0 +1,19 @@
;;; Fibonacci numbers using Edsger Dijkstra's algorithm
;;; http://www.cs.utexas.edu/users/EWD/ewd06xx/EWD654.PDF
(define (fib n)
(define (fib-aux a b p q count)
(cond ((= count 0) b)
((even? count)
(fib-aux a
b
(+ (* p p) (* q q))
(+ (* q q) (* 2 p q))
(/ count 2)))
(else
(fib-aux (+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p
q
(- count 1)))))
(fib-aux 1 0 0 1 n))

View file

@ -1,13 +1,5 @@
:Disp "0" //Dirty, I know, however this does not interfere with the code
:Disp "1"
:Disp "1"
:1→A
:1→B
:0→C
:Goto 1
:Lbl 1
:A+B→C
:Disp C
:B→A
:C→B
:Goto 1
{0,1
While 1
Disp Ans(1
{Ans(2),sum(Ans
End

View file

@ -1,9 +1,3 @@
:Prompt N
:0→A
:1→B
:For(I,1,N)
:A→C
:B→A
:C+B→B
:End
:A
Prompt N
.5(1+√(5 //golden ratio
(Ans^N(-Ans)^-N)/√(5