# Laboratorio saioa: Zenbaki Teoria eta R # # "numbers" paketea instalatzeko: install.packages("numbers") # "numbers" paketea kargatzeko: library("numbers") # laguntza eskatzeko: library(help="numbers") # 1. Ariketa. "numbers" paketeko hainbat funtzio erabiltzea. # Inplementazioa ikusteko, idatzi funtzioaren izena parametrorik gabe isNatural # function (n) # { # stopifnot(is.numeric(n)) # floor(n) == ceiling(n) & n >= 1 & n <= 2^53 - 1 # } # Adi! isNatural funtzioak $2^{53}-1$ zenbakia baino handiagorik ez du onartzen... # zenbaki arruntak eta lehenak isNatural(8) # TRUE 2^53 # 9.007199e+15 2^52 # 4.5036e+15 isNatural(2^52) # TRUE isNatural(2^53) # FALSE isNatural(1000000000000000) # 16 digitoko zenbakia # TRUE isNatural(10000000000000000) # 17 digitoko zenbakia # FALSE is.character(8) # FALSE is.character("8") # TRUE abs(-8) # 8 isPrime(7) # TRUE isPrime(8) # FALSE Primes(1,20) # 2 3 5 7 11 13 17 19 Primes(100,200) # 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 # 179 181 191 193 197 199 nextPrime(2000) # 2003 nextPrime(99999) # 100003 previousPrime(100019) # 100003 # lehen erlatiboak diren egiaztatzeko coprime(1448,1001) # TRUE coprime(1448,1002) # FALSE # zenbakien deskonposaketa zenbaki lehenetan primeFactors(1448) # 2 2 2 181 primeFactors(1001) # 7 11 13 # Zatiketa Euklidestarra. Emandako n eta m zenbakien arteko # zatiketa euklidestarra egin eta zatidura lortzeko: # div(n,m) edo n%/%m, hondarra lortzeko: # mod(n,m) edo n%%m div(7,2) # 3 7%/%2 # 3 mod(7,2) # 1 7%%2 # 1 # Zatitzaile komunetako handienaren kalkulua # (greatest common divisor): GCD(n,m) GCD(1448,1001) # 1 GCD(1448,1002) # 2 # Zatitzaile komunetako handienaren 5. propietatea # (Bezout-en identitatea). Emandako zenbakien zkh kalkulatu # eta zkh(a,b)=xa+yb konbinazio linealeko x eta y koefizienteak # kalkulatzen ditu Euklidesen algoritmoa erabiliz: extGCD(a,b) extGCD(1448,1001) # 1 -421 609 1==-421*1448+609*1001 # TRUE extGCD(1448,1002) # 2 -164 237 2==-164*1448+237*1002 # TRUE ############################################################### ############################################################### # 2. Ariketa. # 2.1 Bi zenbaki oso emanik, a eta b, zatitzaile komunetako handiena # kalkulatuko duen funtzioaren inplementazioa Euklidesen algoritmoan # oinarrituz: zkh <- function(a,b) { return (GCD(a,b)) } ## Deiak funtzioari. a=231, b=1820 -------------------------- zkh(231,1820) # 7 coprime(231,1820) # FALSE GCD(231,1820) # 7 extGCD(231,1820) # 7 -63 8 ## Deiak funtzioari. a=1369, b=2597 ---------------------------- zkh(1369,2597) # 1 coprime(1369,2597) # TRUE GCD(1369,2597) # 1 extGCD(1369,2597) # 1 -1013 534 ## Deiak funtzioari. a=2689, b=4001 ---------------------------- zkh(2689,4001) # 1 coprime(2689,4001) # TRUE GCD(2689,4001) # 1 extGCD(2689,4001) # 1 1662 -1117 ## Funtzioari parametro moduan zenbaki errealak edo karaktereak pasaz gero? zkh(-10,5) # 5 zkh(3.2,4) # 8.881784e-16 zkh("a","b") # Error in abs(a) : non-numeric argument to mathematical function ## ------------------------------------------------------- # 2.2 Hobekuntzak funtzioari. ## Parametro moduan zenbaki errealak pasaz gero, errore mezua erakutsi ## Karaktereak pasaz gero, baita. ## Gogoratu, a karakterea den jakiteko is.character(a) funtzioa erabili # a zenbaki arrunta den jakiteko isNatural(a) funtzioa erabili zkh <- function(a,b) { if(!is.integer(a) || !is.integer(b)){ print("Zenbaki osoak sartu beharr dituzu") return() }else{ return (GCD(a,b)) } } ## Deia funtzioari parametro moduan zenbaki erreala pasata zkh(3.2,4) # "a eta b parametroek zenbaki osoak izan behar dute" ## Deia funtzioari parametro moduan karaktereak pasata zkh("a","b") # "a eta b ezin dira karaktereak izan" ############################################################# ########################################################## ## 3. Ariketa ## Zenbaki bat emanik, harekin lehen erlatiboa den beste zenbaki bat ## kalkulatuko duen funtzioa idatzi. ## 3.1 Parametro moduan funtzioari pasatako m-rekin ehen erlatiboa den # zenbaki oso positiborik txikienaren kalkulua ## lehen_erlatibo_txiki <- function(m) { } ## Deiak funtzioari. lehen_erlatibo_txiki(13797) # 2 lehen_erlatibo_txiki(16974) # 5 lehen_erlatibo_txiki(56970) # 7 lehen_erlatibo_txiki(1000000000000000) # 3 ##----------------------------------------------------------------- ## 3.2 Funtzioa egokitu, bilatzen dugun zenbaki hori ahalik eta txikiena # izan ordez finkatutako balio bat (atalasea) baino handiagoa izan dadin lehen_erlatibo <- function(m,atalasea) { } ## Zenbaki handiekin lan egitean, kontuz. lehen_erlatibo(13797, 50) # 50 lehen_erlatibo(16974, 54687) # 54689 lehen_erlatibo(56970,26378) # 26381 lehen_erlatibo(9674,26378) # 26379 lehen_erlatibo(1000000000000000,26378) # 26379 lehen_erlatibo(1000000000000000,2637800000) # 2637800001 # Kriptografiako RSA gakoen kalkuluan zenbakiak handiak # izatea garrantzitsua da ################################################## ########################################################## ## 4. Ariketa. ASCII kodeketarekin jolasten ## Hizkien ASCII kodeak kalkulatzeko ## Hizkiz hizki edo hitz osoa kolpetik strtoi(charToRaw("k"),16L) strtoi(charToRaw("a"),16L) strtoi(charToRaw("i"),16L) strtoi(charToRaw("x"),16L) strtoi(charToRaw("o"),16L) strtoi(charToRaw("kaixo"),16L) ## Orain ASCII kodeetatik hizkietara ## Kodez kode edo kode zerrenda bat kolpetik rawToChar(as.raw(107)) rawToChar(as.raw(97)) rawToChar(as.raw(105)) rawToChar(as.raw(120)) rawToChar(as.raw(111)) hitza<-c(107,97,105,120,111) rawToChar(as.raw(hitza)) ## Funtzioaren inplementazioa: testu_sekretu <- function(testua) { ktestua<-strtoi(charToRaw(testua),16L) ztestua<-ktestua+5 ztestuachar<-rawToChar(as.raw(ztestua)) print(ztestuachar) } # Deia fuhnjtzioari testu_sekretu("kaixo") # "pfn}t"