JNZ YOURMOM
fib
xor eax, eax
mov ecx, [esp+4]
inc eax
inc ecx
cdq
fibloop
add eax, edx
xchg eax, edx
loop fibloop
ret
fld PHI
fild d[esp+4]
call pow
fld PHI2
fild d[esp+4]
call pow
fsub
fld SQRT5
fdiv
fistp d[esp+4]
mov eax, [esp+4]
ret
pow
and definition of the constants left as an exercise for the reader.
LDY #0
LOOP0 TYA
PHA
LDA STRING,Y
BEQ END
JSR $FFD2 ;C64 KERNAL CHROUT, TRASHES REGS
PLA
TAY
INY
BEQ ERR
JMP LOOP0
END CLC ;INDICATE NO ERROR
RTS
ERR SEC ;YOU FUCKED UP
RTS
STRING .DB "FAGGOTS GONNA FAG."
STREND .DB 0
$ pgpdump | grep 'Key ID'
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
iF4EAREKAAYFAlDjdkAACgkQGRQwWY30ng0ycAD8D+YREJtWmYp9pVQisEQqw+El
IE8NUumJLs5EI/M7Q8cA/3PSR/Xqe6h0FKFOiJRBLVpaHONmnKP+3R13THTsjxE3
=0D/X
-----END PGP SIGNATURE-----
Key ID - 0x191430598DF49E0D
(define (square n) $ * n n)
(define (fibs n)
$ cond ((= n 0) 0)
((= n 1) 1)
((= n 2) 1)
((even? n)
$ let ($ n2 $ / n 2)
$ - (square $ fibs $ + n2 1) $ square $ fibs $ - n2 1)
$ else
$ let ($ n2 $ / (- n 1) 2)
$ + (square $ fibs n2) $ square $ fibs $ + n2 1)
(define (ofibs n)
$ if (= n 0)
0
$ let loop ((i 1) (a 0) $ b 1)
$ if (= i n)
b
$ loop (+ i 1) b $ + a b)
(define (square n) : * n n)
(define (fibs n)
: cond ((= n 0) 0)
((= n 1) 1)
((= n 2) 1)
((even? n)
: let (: n2 : / n 2)
: - (square : fibs : + n2 1) : square : fibs : - n2 1)
: else
: let (: n2 : / (- n 1) 2)
: + (square : fibs n2) : square : fibs : + n2 1)
(define (ofibs n)
: if (= n 0)
0
: let loop ((i 1) (a 0) : b 1)
: if (= i n)
b
: loop (+ i 1) b : + a b)
fib:
mov eax, [esp+4]
test eax, eax
jnz .impl
mov eax, 0
mov edx, 1
ret
.impl:
push eax
sar eax, 1
push eax
call fib
mov ecx, eax
imul ecx, edx
sal ecx, 1
imul eax, eax
imul edx, edx
pop ebx
pop ebx
test ebx, 1
jz .even
.odd:
add eax, edx
add edx, ecx
ret
.even:
add edx, eax
neg eax
add eax, ecx
ret
fib:
mov eax, [esp+4]
test eax, eax
jnz .impl
mov eax, 0
mov edx, 1
ret
.impl:
shr eax, 1
push eax
call fib
mov ecx, eax
imul ecx, edx
shl ecx, 1
imul edx, edx
imul eax, eax
pop ebx
mov ebx, [esp+4]
test ebx, 1
jz .even
.odd:
add eax, edx
add edx, ecx
ret
.even:
add edx, eax
neg eax
add eax, ecx
ret
mov eax, 0
mov edx, 1
xor eax, eax
inc eax
cdq
xchg eax, edx
xor eax, eax
cdq
inc edx
eax
is zero already. Socdq
inc edx
f_{2n+1} = f_{n}^2 + f_{n+1}^2
f_{2n} = f_{2n+1} - f_{2n-1}
= (f_{n}^2 + f_{n+1}^2) - (f_{n-1}^2 + f_{n}^2)
= f_{n+1}^2 - f_{n-1}^2
= f_{n+1}^2 - (f_{n+1} - f_{n})^2
= f_{n+1}^2 - (f_{n+1}^2 - 2f_{n+1}f_{n} + f_{n}^2)
= f_{n+1}^2 - f_{n+1}^2 + 2f_{n+1}f_{n} - f_{n}^2
= 2f_{n+1}f_{n} - f_{n}^2
Two successor functions:
(f_{n},f_{n+1}) -> (2f_{n+1}f_{n} - f_{n}^2, f_{n}^2 + f_{n+1}^2) = (f_{2n},f_{2n+1})
(f_{n},f_{n+1}) -> (f_{n+1},f_{n}+f_{n+1}) = (f_{n+1},f_{n+2})
(n, f1, f2) -> (2n, (2f2 - f1)f1, f1f1 + f2f2)
(n, f1, f2) -> (n+1, f2, f1 + f2)
exponentiation algorithm:
(n, acc) -> (2n, acc*acc)
(n, acc) -> (n+1, acc*x)
(require 'logical)
(define (top-down-build n double increment zero)
(let loop ((n n))
(cond ((zero? n) zero)
((even? n) (double (loop (/ n 2))))
(else (increment (loop (- n 1)))))))
(define (bottom-up-build n double increment zero)
(if (= n 0)
zero
(let loop ((bit-index (- (integer-length n) 1)) (v zero))
(if (= bit-index 0)
(if (logbit? bit-index n)
(increment v)
v)
(if (logbit? bit-index n)
(loop (- bit-index 1) (double (increment v)))
(loop (- bit-index 1) (double v)))))))
(define (id-functor builder)
(lambda (n)
(let ((double (lambda (acc) (* acc 2)))
(increment (lambda (acc) (+ acc 1)))
(zero 0))
(builder n double increment zero))))
(define (exp-functor builder)
(lambda (x n)
(let ((double (lambda (acc) (* acc acc)))
(increment (lambda (acc) (* acc x)))
(zero 1))
(builder n double increment zero))))
(define (fibs-functor builder)
(lambda (n)
(let ((double (lambda (args) (apply (lambda (f1 f2)
(list (* f1 (- (* f2 2) f1))
(+ (* f1 f1) (* f2 f2))))
args)))
(increment (lambda (args) (apply (lambda (f1 f2)
(list f2
(+ f1 f2)))
args)))
(zero (list 0 1)))
(car (builder n double increment zero)))))
(define id_b (id-functor bottom-up-build))
(define id_t (id-functor top-down-build))
(define exp_b (exp-functor bottom-up-build))
(define exp_t (exp-functor top-down-build))
(define fibs_b (fibs-functor bottom-up-build))
(define fibs_t (fibs-functor top-down-build))
(require '2hu-suss-magic-assembler)
(subproc (frobnicate :x86@16-bit :cdecl :align 8 :segment '(para public "code") :assume '(cs@cseg ds@dseg))
(mov ax dseg)
(mov ds ax)
(mov es ax)
(mov bx 32)
(add bx bx)
(add bx bx)
(xor cx cx)
(mov ax (wordptr bx))
(mov (wordptr bx) cx)
(mov ah #x4C)
(int 21h))
#include <limits.h>
#define UNSIGNED_LONG_LONG_BITS (sizeof(unsigned long long)*CHAR_BIT)
unsigned long long fibs(unsigned long long n) {
// zero
unsigned long long f1 = 0;
unsigned long long f2 = 1;
unsigned long long temp;
unsigned long long mask = ((unsigned long long)1)<<(UNSIGNED_LONG_LONG_BITS-1);
for(;;) {
if(n & mask) {
// increment
temp = f1 + f2;
f1 = f2;
f2 = temp;
}
if(mask >>= 1) {
// double
temp = f1*(2*f2 - f1);
f2 = f1*f1 + f2*f2;
f1 = temp;
} else break;
}
return f1;
}
/********************************************************************/
/********************************************************************/
/* */
/* program Name: MICRTPG2 */
/* */
/* programming Language: MI */
/* */
/* Description: Initial version of MI program MICRTPG2, */
/* which calls QPRCRTPG API. */
/* */
/* */
/* Header Files Included: None */
/* */
/* */
/********************************************************************/
/* Entry point and associated parameters */
ENTRY * (*ENTRY) EXT;
DCL SPCPTR FIL@ PARM;
DCL SPCPTR MBR@ PARM;
DCL OL *ENTRY (MBR@, FIL@) PARM EXT MIN(1);
DCL DD FIL CHAR(10) BAS(FIL@);
DCL DD MBR CHAR(10) BAS(MBR@);
DCL DD NUM_PARMS BIN( 4);
/* Control field for first time initialization */
DCL DD READY CHAR( 1) INIT("0");
/* Binary offset into the space */
DCL DD BINOFFSET BIN(4) AUTO INIT(0);
DCL SPCPTR BINOFFSET@ AUTO INIT(BINOFFSET);
/* Pointers for accessing the space */
DCL SPCPTR USRSPC;
DCL SYSPTR USRSPC@;
/* QCMDEXC and associated CL commands */
DCL SYSPTR QCMDEXC INIT("QCMDEXC", CTX("QSYS"), TYPE(PGM));
DCL DD CLOVRCMD CHAR(65);
DCL DD OVRSTR CHAR(39) DEF(CLOVRCMD) POS(1)
INIT("OVRDBF MISRC 1234567890 MBR(1234567890)");
DCL DD OVRSTR2 CHAR(26) DEF(CLOVRCMD) POS(40)
INIT(" POSITION(*RRN 1234567890)");
DCL DD FILNAM CHAR(10) DEF(CLOVRCMD) POS(14);
DCL DD MBRNAM CHAR(10) DEF(CLOVRCMD) POS(29);
DCL DD RECNUM ZND(10,0) DEF(CLOVRCMD) POS(55);
DCL SPCPTR CLOVRCMD@ INIT(CLOVRCMD);
DCL DD CLOVRLNG PKD(15,5) INIT(P'65');
DCL SPCPTR CLOVRLNG@ INIT(CLOVRLNG);
DCL OL QCMDOVROL (CLOVRCMD@, CLOVRLNG@) ARG;
DCL DD CLDLTCMD CHAR(12) INIT("DLTOVR MISRC");
DCL SPCPTR CLDLTCMD@ INIT(CLDLTCMD);
DCL DD CLDLTLNG PKD(15,5) INIT(P'12');
DCL SPCPTR CLDLTLNG@ INIT(CLDLTLNG);
DCL OL QCMDDLTOL (CLDLTCMD@, CLDLTLNG@) ARG;
/* CL06 and associated parameters */
DCL SYSPTR CL06 INIT("CL06", TYPE(PGM));
DCL DD OFFSET PKD(15,5);
DCL SPCPTR OFFSET@ INIT(OFFSET);
DCL OL CL06OL (USRSPC, OFFSET@) ARG;
/* Access QTEMP address */
DCL SYSPTR QTEMP@ BASPCO POS(65);
/* Template for CRTS MI instruction */
DCL DD CRTSTMPLT CHAR(160) BDRY(16);
DCL DD TMPLTSPEC CHAR(8) DEF(CRTSTMPLT) POS(1);
DCL DD TMPLTSIZE BIN(4) DEF(TMPLTSPEC) POS(1) INIT(160);
DCL DD TMPLTBA BIN(4) DEF(TMPLTSPEC) POS(5) INIT(0);
DCL DD OBJID CHAR(32) DEF(CRTSTMPLT) POS(9);
DCL DD SPCTYPE CHAR(1) DEF(OBJID) POS(1) INIT(X'19');
DCL DD SPCSUBTYPE CHAR(1) DEF(OBJID) POS(2) INIT(X'EF');
DCL DD SPCNAME CHAR(30) DEF(OBJID) POS(3) INIT("MICRTPG2");
DCL DD OBJCRTOPT CHAR(4) DEF(CRTSTMPLT) POS(41) INIT(X'60020000');
DCL DD OBJRCVOPTS CHAR(4) DEF(CRTSTMPLT) POS(45);
DCL DD * CHAR(2) DEF(OBJRCVOPTS) POS(1) INIT(X'0000');
DCL DD ASP CHAR(2) DEF(OBJRCVOPTS) POS(3) INIT(X'0000');
DCL DD SPCSIZ BIN(4) DEF(CRTSTMPLT) POS(49) INIT(1);
DCL DD INTSPCVAL CHAR(1) DEF(CRTSTMPLT) POS(53) INIT(X'00');
DCL DD PERFCLASS CHAR(4) DEF(CRTSTMPLT) POS(54) INIT(X'00000000');
DCL DD * CHAR(1) DEF(CRTSTMPLT) POS(58) INIT(X'00');
DCL DD PUBAUT CHAR(2) DEF(CRTSTMPLT) POS(59) INIT(X'0000');
DCL DD TMPLTEXTN BIN(4) DEF(CRTSTMPLT) POS(61) INIT(96);
DCL SYSPTR CONTEXT DEF(CRTSTMPLT) POS(65);
DCL SYSPTR ACCESSGRP DEF(CRTSTMPLT) POS(81);
DCL SYSPTR USRPRF DEF(CRTSTMPLT) POS(97);
DCL DD MAXSPCSIZ BIN(4) DEF(CRTSTMPLT) POS(113) INIT(0);
DCL DD DOMAIN CHAR(2) DEF(CRTSTMPLT) POS(117) INIT(X'0001');
DCL DD * CHAR(42) DEF(CRTSTMPLT) POS(119) INIT((42)X'00');
DCL SPCPTR CRTSTMPLT@ INIT(CRTSTMPLT);
/* QPRCRTPG and associated parameters */
DCL DD PGM CHAR(20);
DCL DD PGMNAM CHAR(10) DEF(PGM) POS(1);
DCL DD PGMLIBNAM CHAR(10) DEF(PGM) POS(11) INIT("*CURLIB ");
DCL SPCPTR PGM@ INIT(PGM);
DCL DD PGMTXT CHAR(50) INIT(" ");
DCL SPCPTR PGMTXT@ INIT(PGMTXT);
DCL DD PGMSRCF CHAR(20) INIT("*NONE");
DCL SPCPTR PGMSRCF@ INIT(PGMSRCF);
DCL DD PGMSRCM CHAR(10) INIT(" ");
DCL SPCPTR PGMSRCM@ INIT(PGMSRCM);
DCL DD PGMSRCCHG CHAR(13) INIT(" ");
DCL SPCPTR PGMSRCCHG@ INIT(PGMSRCCHG);
DCL DD PRTFNAM CHAR(20) INIT("QSYSPRT *LIBL ");
DCL SPCPTR PRTFNAM@ INIT(PRTFNAM);
DCL DD PRTSTRPAG BIN(4) INIT(1);
DCL SPCPTR PRTSTRPAG@ INIT(PRTSTRPAG);
DCL DD PGMPUBAUT CHAR(10) INIT("*ALL ");
DCL SPCPTR PGMPUBAUT@ INIT(PGMPUBAUT);
DCL DD PGMOPTS(16) CHAR(11) INIT((1)"*LIST", *(2)(1)"*REPLACE",
*(3)(1)"*XREF");
DCL SPCPTR PGMOPTS@ INIT(PGMOPTS);
DCL DD NUMOPTS BIN(4) INIT(3);
DCL SPCPTR NUMOPTS@ INIT(NUMOPTS);
DCL OL QPRCRTPGOL (USRSPC, BINOFFSET@, PGM@, PGMTXT@, PGMSRCF@,
PGMSRCM@, PGMSRCCHG@, PRTFNAM@, PRTSTRPAG@,
PGMPUBAUT@, PGMOPTS@, NUMOPTS@) ARG;
DCL SYSPTR QPRCRTPG INIT("QPRCRTPG", CTX("QSYS"), TYPE(PGM));
/* Start of instruction stream */
STPLLEN NUM_PARMS;
CMPNV(B) NUM_PARMS, 2 / EQ(PARM2);
CPYBLAP FILNAM, 'MISRC', ' ';
B PARM1;
PARM2: CPYBLA FILNAM, FIL;
PARM1: CPYBLA MBRNAM,MBR;
CMPBLA(B) READY, '1' / EQ(SKIP);
CPYBWP CONTEXT, QTEMP@;
CRTS USRSPC@, CRTSTMPLT@;
SETSPPFP USRSPC,USRSPC@;
CPYBLA READY, '1';
SKIP: CPYNV RECNUM, 1;
MORE: CALLX QCMDEXC, QCMDOVROL, *;
CPYNV OFFSET,1;
CALLX CL06, CL06OL, *;
SUBN(S) OFFSET, 1;
ADDN(S) BINOFFSET, OFFSET;
SETSPPO USRSPC, BINOFFSET;
ADDN(S) RECNUM, 20;
CALLX QCMDEXC, QCMDDLTOL, *;
CMPNV(B) OFFSET, 1600 /EQ(MORE);
CPYBLA PGMNAM, MBR;
SETSPPO USRSPC, 0;
CALLX QPRCRTPG, QPRCRTPGOL, *;
RTX *;
PEND;
template<class T, class D, class I>
T topDownBuildT(int n, D doub, I inc, T zero) {
auto rec = [=](int x) topDownBuildT(x, doub, inc, zero);
return n ? n&1 ? inc(rec(n-1)) : doub(rec(n/2)) : zero;
}
auto topDownBuild = [](int n, auto doub, auto inc, auto zero)
topDownBuildT(n,doub,inc,zero);
auto bottomUpBuild = [](int n, auto doub, auto inc, auto res) {
if (!n) return res;
for(int i=31-__builtin_clz(n); i>=0; --i)
res = 1&(n>>i) ? inc(doub(res)) : doub(res);
return res;
};
#include <utility>
auto fibsFunctor = [](auto builder) {
auto doub = [](auto p) std::make_pair(
p.first * (2*p.second - p.first),
p.first*p.first + p.second*p.second);
auto inc = [](auto p) std::make_pair(p.second, p.first+p.second);
auto zero = std::make_pair(0,1);
return [=](int n) builder(n, doub, inc, zero);
};
auto fibs_t = fibsFunctor(topDownBuild);
auto fibs_b = fibsFunctor(bottomUpBuild);
fib:
xor eax, eax
cmp rcx, 93
ja .ret
lea rax, fibs[rip]
mov rax, QWORD PTR [rax+rcx*8]
.ret:
ret
fibs:
.quad 0
.quad 1
.quad 1
.quad 2
.quad 3
.quad 5
.quad 8
.quad 13
.quad 21
.quad 34
.quad 55
.quad 89
.quad 144
.quad 233
.quad 377
.quad 610
.quad 987
.quad 1597
.quad 2584
.quad 4181
.quad 6765
.quad 10946
.quad 17711
.quad 28657
.quad 46368
.quad 75025
.quad 121393
.quad 196418
.quad 317811
.quad 514229
.quad 832040
.quad 1346269
.quad 2178309
.quad 3524578
.quad 5702887
.quad 9227465
.quad 14930352
.quad 24157817
.quad 39088169
.quad 63245986
.quad 102334155
.quad 165580141
.quad 267914296
.quad 433494437
.quad 701408733
.quad 1134903170
.quad 1836311903
.quad 2971215073
.quad 4807526976
.quad 7778742049
.quad 12586269025
.quad 20365011074
.quad 32951280099
.quad 53316291173
.quad 86267571272
.quad 139583862445
.quad 225851433717
.quad 365435296162
.quad 591286729879
.quad 956722026041
.quad 1548008755920
.quad 2504730781961
.quad 4052739537881
.quad 6557470319842
.quad 10610209857723
.quad 17167680177565
.quad 27777890035288
.quad 44945570212853
.quad 72723460248141
.quad 117669030460994
.quad 190392490709135
.quad 308061521170129
.quad 498454011879264
.quad 806515533049393
.quad 1304969544928657
.quad 2111485077978050
.quad 3416454622906707
.quad 5527939700884757
.quad 8944394323791464
.quad 14472334024676221
.quad 23416728348467685
.quad 37889062373143906
.quad 61305790721611591
.quad 99194853094755497
.quad 160500643816367088
.quad 259695496911122585
.quad 420196140727489673
.quad 679891637638612258
.quad 1100087778366101931
.quad 1779979416004714189
.quad 2880067194370816120
.quad 4660046610375530309
.quad 7540113804746346429
.quad -6246583658587674878