DECLARE SUB Square () DECLARE SUB Plus (p&) DECLARE SUB Division () DECLARE SUB Mult (im&) DECLARE SUB NFatorial () DECLARE SUB MinusOne () DECLARE SUB PlusOne () DECLARE SUB ResetNum () DECLARE SUB NPot2 () DECLARE SUB Mult2 () DECLARE SUB ShowNum () DECLARE FUNCTION dMod# (a#, b#) DEFINT A-Z DIM SHARED a(1 TO 1000) AS DOUBLE, np, dec, nfat, NPot AS LONG DIM SHARED b(1 TO 1000) AS DOUBLE, Div#, er, nbase#, Mersenne DIM SHARED Prog(1 TO 100) AS STRING, nProg, pLin, rp, loopc CLS dec = 9 nbase# = 10# ^ dec nProg = 0: rp = 0: pLin = 0 a(1) = 1: np = 1 FOR i = 1 TO np: b(i) = a(i): NEXT DO ShowNum PRINT IF rp THEN pLin = pLin + 1 cmd$ = Prog(pLin) PRINT "=>"; cmd$ IF cmd$ = "" THEN rp = 0 ELSE LINE INPUT ">", cmd$ END IF cmd$ = UCASE$(cmd$) p = INSTR(cmd$, ":") par$ = "" IF p THEN par$ = MID$(cmd$, p + 1): cmd$ = LEFT$(cmd$, p - 1) SELECT CASE cmd$ CASE "CLS": CLS CASE "RPT" IF loopc = 0 THEN loopc = VAL(par$) loopc = loopc - 1 IF loopc > 0 THEN pLin = 0 CASE "RESET" a(1) = 1: np = 1 Mersenne = 0 modulo = 0 FOR i = 1 TO np: b(i) = a(i): NEXT CASE "END": IF rp THEN rp = 0 ELSE SYSTEM CASE "LIST" FOR i = 1 TO nProg: PRINT i; Prog(i); : NEXT CASE "RUN" pLin = 0: rp = -1: Last& = 0 CASE "PROG" nProg = 0 PRINT "Criar programa :" DO PRINT USING "###:"; nProg + 1; LINE INPUT "", lin$ IF lin$ = "" THEN EXIT DO nProg = nProg + 1 Prog(nProg) = UCASE$(lin$) LOOP CASE "MCHK" Mersenne = NOT Mersenne PRINT "Mersenne Checking "; IF Mersenne THEN PRINT "On" ELSE PRINT "Off" CASE "MOD" modulo = NOT modulo IF modulo THEN IF par$ = "" THEN INPUT "Start :", c1& INPUT "Step : ", c2& ELSE p = INSTR(par$, ",") c1& = VAL(LEFT$(par$, p - 1)) c2& = VAL(MID$(par$, p + 1)) END IF END IF CASE "NUM" IF par$ = "" THEN INPUT "a()=", n$ ELSE n$ = par$ n$ = RIGHT$(SPACE$(101 * dec) + n$, 100 * dec) np = 0 DO WHILE n$ <> "" np = np + 1 a(np) = VAL(RIGHT$(n$, dec) + "#") n$ = LEFT$(n$, LEN(n$) - dec) LOOP FOR j = np TO 1 STEP -1 IF a(j) <> 0 THEN EXIT FOR NEXT FOR i = j + 1 TO np: a(i) = 0: NEXT np = j CASE "+1" PlusOne CASE "-1" MinusOne CASE "FAT" IF par$ = "" THEN INPUT "nfat=", nfat ELSE nfat = VAL(par$) NFatorial CASE "POT2" IF par$ = "" THEN INPUT "npot2=", NPot ELSE NPot = VAL(par$) NPot2 CASE "SQR" Square CASE "DIV" IF par$ = "" THEN INPUT "Div#=", Div# ELSE Div# = VAL(par$ + "#") Division CASE "MULT" IF par$ = "" THEN INPUT "Mult&=", m& ELSE m& = VAL(par$ + "&") Mult m& CASE "PLUS" IF par$ = "" THEN INPUT "Plus&=", p& ELSE p& = VAL(par$ + "&") Plus p& CASE "TEST" FOR i = 1 TO np: b(i) = a(i): NEXT anp = np IF modulo THEN Start& = c1& + c2& Stp& = c2& ELSE IF rp THEN IF Last& = 0 THEN Start& = 3 ELSE Start& = Last& ELSE INPUT "Start=", Start& END IF IF Start& < 3 THEN Start& = 3 IF Start& MOD 2 = 0 THEN Start& = Start& + 1 Stp& = 2 END IF FOR k& = Start& TO nbase# STEP Stp& IF Mersenne IMP (k& MOD 8 = 1 OR k& MOD 8 = 7) THEN IF k& > 3 THEN max& = CLNG(SQR(k&)) FOR z& = 3 TO max& + 1 STEP 2 IF k& MOD z& = 0 THEN EXIT FOR NEXT END IF IF k& = 3 OR z& > max& + 1 THEN LOCATE CSRLIN, 1: PRINT "/"; k&; "="; np = anp FOR i = 1 TO np: a(i) = b(i): NEXT Div# = k& Division IF er THEN er = 0: Last& = 0 ELSE Last& = k&: ShowNum: PRINT " "; : EXIT FOR IF INKEY$ <> "" OR er = 2 THEN er = 0: np = anp: FOR i = 1 TO np: a(i) = b(i): NEXT: EXIT FOR END IF END IF NEXT PRINT END SELECT LOOP SYSTEM SUB Division IF Div# >= nbase# THEN PRINT "Max"; : er = 2: EXIT SUB FOR i = np TO 1 STEP -1 x# = INT(a(i) / Div#) y# = CLNG(dMod(a(i), Div#)) a(i) = x# IF y# > 0 THEN IF i = 1 THEN PRINT "Ndiv"; : er = -1: EXIT FOR ELSE a(i - 1) = a(i - 1) + y# * nbase# END IF END IF NEXT FOR i = np TO 1 STEP -1 IF a(i) <> 0 THEN np = i: EXIT FOR a(i) = 0 NEXT END SUB FUNCTION dMod# (a#, b#) d# = ((a# / b#) - INT(a# / b#)) * b# IF d# <= 1D-35 THEN d# = 0 dMod# = d# END FUNCTION SUB MinusOne a(1) = a(1) - 1 FOR i = 1 TO np IF a(i) < 0 THEN a(i) = a(i) + nbase#: a(i + 1) = a(i + 1) - 1: x = i NEXT END SUB SUB Mult (im&) FOR i = 1 TO np a(i) = a(i) * im& NEXT FOR i = 1 TO np x = INT(a(i) / nbase#) IF x > 0 THEN y# = CLNG(dMod(a(i), nbase#)) a(i + 1) = a(i + 1) + x a(i) = y# END IF NEXT IF x > 0 THEN np = np + 1 END SUB SUB NFatorial ResetNum FOR i& = 1 TO nfat LOCATE CSRLIN, 1: PRINT USING "#####> "; i&; Mult i& SELECT CASE INKEY$ CASE CHR$(27): EXIT FOR END SELECT NEXT END SUB SUB NPot2 ResetNum FOR i& = 1 TO NPot LOCATE CSRLIN, 1: PRINT USING "#####> "; i&; Mult 2 SELECT CASE INKEY$ CASE CHR$(27): EXIT FOR END SELECT NEXT END SUB SUB Plus (p&) a(1) = a(1) + p& FOR i = 1 TO np IF a(i) >= nbase# THEN a(i) = a(i) - nbase#: a(i + 1) = a(i + 1) + 1 NEXT IF a(np + 1) > 0 THEN np = np + 1 END SUB SUB PlusOne a(1) = a(1) + 1 FOR i = 1 TO np IF a(i) >= nbase# THEN a(i) = a(i) - nbase#: a(i + 1) = a(i + 1) + 1 NEXT IF a(np + 1) > 0 THEN np = np + 1 END SUB SUB ResetNum FOR i = 1 TO 1000 a(i) = 0 NEXT a(1) = 1: np = 1 END SUB SUB ShowNum x$ = "" FOR i = np TO 1 STEP -1 IF a(i) > 0 OR i < np THEN PRINT RIGHT$(x$ + LTRIM$(STR$(a(i))), dec); x$ = STRING$(dec, "0") END IF NEXT END SUB SUB Square FOR i = 1 TO np: b(i) = 0: NEXT FOR i = 1 TO np FOR j = 1 TO np b(i + j - 1) = b(i + j - 1) + a(i) * a(j) FOR z = 1 TO 2 * np x# = INT(b(z) / nbase#) IF x# > 0 THEN y# = CLNG(dMod(b(z), nbase#)) b(z + 1) = b(z + 1) + x# b(z) = y# END IF NEXT NEXT NEXT np = 2 * np FOR i = 1 TO np: a(i) = b(i): NEXT IF a(np) = 0 THEN np = np - 1 END SUB