Sei sulla pagina 1di 55

Strumenti per il calcolo numerico Matlab/Octave

Informatica B Prof. A. Morzenti

Matlab
Cos Matlab:
strumento (e corrispondente linguaggio) per elaborazioni di calcolo numerico NB: sta per MATrix LABoratory
centrato sulle matrici (ma include generiche funzionalit matematiche)

usato nei successivi corsi di calcolo numerico MATLAB uno strumento commerciale distribuito, su licenza NON gratuita, da The MathWorks Inc
Student edition disponibile quando si al Politecnico (http://www.asi.polimi.it/software/matlab.html)

Esiste un altro strumento di nome Octave


identico nella concezione, molto simile per gli aspetti operativi disponibile gratuitamente, vedi www.gnu.org/software/octave/

-2-

Caratteristiche del linguaggio di Matlab/Octave (1)


Linguaggio di alto livello simile a linguaggi di programmazione C, Java, Pascal possiede comandi sintetici per effettuare complesse elaborazioni numeriche Linguaggio interpretato, comandi e istruzioni
NON tradotti in codice eseguibile dallhardware MA manipolati da un programma (linterprete) che li analizza ed esegue azioni da essi descritte

Linguaggio dinamico NON occorre dichiarare le variabili


risultano definite dal punto in cui vengono introdotte
e vengono incluse in una struttura detta tabella dei simboli

il tipo delle variabili dinamico


a una variabile si possono assegnare, successivamente, valori di tipo diverso (scalari, stringhe, vettori, matrici...)

-3-

Caratteristiche del linguaggio di Matlab/Octave (2) In Matlab/Octave tutto un array


ci sono casi particolari significativi di array
array 1x1 sono gli scalari array con una sola riga o colonna sono i vettori array con due dimensioni sono le matrici array con >2 dimensioni: matrici multidimensionali

-4-

Screenshot interfaccia MATLAB


Mostra le variabili nel workspace

Contenuto della directory corrente

Finestra dei comandi

Storia dei comandi Lancia i tool di MATLAB ed altro


-5-

Screenshot dellinterfaccia OCTAVE

Linea di comando dellinterprete

-6-

Comandi in Matlab
Matlab accetta comandi che lutente scrive di seguito al prompt: >> es. >> a = 10; Assegna alla variabile a il valore 10 Esempio di alcuni comandi (analizzeremo quelli pi importanti) Il prompt accetta i comandi del sistema operativo (DOS, UNIX)
Esempio: in ambiente dos, dir mostra il contenuto della directory corrente

help richiama la guida in linea diary pu essere utilizzato per salvare la sessione di lavoro who, whos e workspace mostrano lelenco delle variabili definite save permette di salvare in un file le variabili definite. Load le ricarica clear cancella tutte le variabili

-7-

Esempi
Input 1234/6 a=1234/6 eps Output ans = 205.67 a = 205.67 eps = 2.2204e-16 Commento calcolo di un valore scalare assegnamento alla risultato di 1234/6 variabile a del

variabile predefinita: la pi piccola differenza rappresentabile tra due numeri divisione destra divisione per zero potenza real una funzione predefinita che restituisce la parte reale di un numero complesso 1 = vero, 0 = falso, == uguale, ~= diverso (codice ASCII di ~: 126)
-8-

2/5 5/0 5^2 real(4+5j)

ans = 0.40000 ans = Inf ans = 25 ans = 4

1+1==2 1+1~=2

ans = 1 ans = 0

Esempi con gli array


a=[1 2; 3, 4] a = 1 3 a a = 1 3 x=[-1.3 sqrt(3) (1+2)/5] x(5)=abs(x(1)) 2 4 0.60000 0.60000 0.00000 2 4 a ora una matrice 2x2, ; separa le righe; virgola opzionalmente separa elementi (ma basta lo spazio) restituisce variabile a il valore della

x = -1.30000 1.73205 x = -1.30000 1.73205 1.30000

elementi possono espressioni

essere

Notazione con () per accedere a elementi di una matrice; abs valore assoluto; NB: vettore x esteso per includere nuovo elemento; elementi non assegnati sono nulli

b=a

b = 1 2 c = 2 5 y = -1 0 2

3 4 5 8

matrice trasposta (scambiate righe e colonne) somma di matrici, elemento per elemento (sottrazione con - simile) il ; blocca loutput, ma non impedisce la valutazione
-9-

c=a+b

x=[-1 0 2]; y=x'

Altre operazioni con gli array


a = [] x=1:5 a = [] x = 1 2 3 4 5 array vuoto, convenzionalmente rappresenta valore nullo operatore : per vettori di numeri produrre

y=0:pi/4:pi

y = 0.00000 1.57080 3.14159 v = 10 6

operatore : con passo di 0.78540 incremento e valori non interi 2.35619 (pi pigreco) valori negativi del passo e degli estremi

v=10:-4:-3 sin(y)

-2

ans = 0.00000 1.00000 0.00000

funzioni predefinite si applicano 0.70711 ai vettori 0.70711 produce la tabella di sin(x), 0x/2

x=[0:pi/100:pi/2]'; [x sin(x)]

ans = 0.00000 0.00000 0.03142 0.03141 ...... 1.53938 0.99951 1.57080 1.00000
- 10 -

Diagrammi a due dimensioni


Diagramma = insieme di coppie che rappresentano coordinate di punti Si usano vettori per contenere sequenze ordinate dei valori di ognuna delle coordinate plot(x,y) disegna digramma cartesiano dei punti che hanno valori delle ascisse in x, delle ordinate in y e li congiunge con una linea, per dare continuit al grafico funzioni xlabel per visualizzare nome asse ascisse, ylabel per ordinate, title per il titolo
cubica 1000 800 600 400 200 ordinate 0 -200 -400 -600 -800

- 11 -

-1000 -10

-8

-6

-4

-2

0 ascisse

10

Un esempio di cinematica
Due treni partono da due stazioni adiacenti, che distano 15km, viaggiando a velocit di 50m/s e 30m/s in direzione opposta Costruire un grafico che mostra il loro movimento, fino a quando il pi veloce raggiunge la destinazione
Il pi veloce impiega 15000/50=300s
DistanzaTreno1=50t; DistranzaTreno2=15000-30t; (per mostrare la provenienza dalla direzione opposta)

- 12 -

Soluzione

t=0:1:300; p1=50 * t; p2=15000 30 * t; plot(t,p1); hold on %adesso possibile inserire nuove curve sul grafico plot(t,p2) hold off

- 13 -

Risultati ottenuti con lesempio

- 14 -

Istruzioni e ;
Le istruzioni possono essere seguite da ; ma non obbligatorio Il ; blocca la visualizzazione del valore delle variabili coinvolte nellistruzione
Maggiore velocit di esecuzione

Regola di buona programmazione


Inserire sempre il ;, a meno che non si voglia ispezionare il valore di una variabile a scopo di debugging

- 15 -

Commenti
Il simbolo di commento pu essere messo in qualsiasi punto della linea. MATLAB ignorer tutto quello che viene scritto alla destra del simbolo %. Per esempio: >>% This is a comment. >>x = 2+3 % So is this. x= 5

- 16 -

Array e variabili
Lunit fondamentale di dati in MATLAB larray Una variabile in MATLAB una regione di memoria che contiene un array Ha un nome definito dallutente Per i nomi valgono regole simili a quelle del C C un linguaggio a tipizzazione forte Le variabili vanno dichiarate prima delluso MATLAB un linguaggio a tipizzazione debole Le variabili vengono create assegnando ad esse dei valori Il loro tipo determinato dal tipo dei valori assegnati

- 17 -

Tipo double
Una variabile di tipo double contiene uno scalare o un array di numeri espressi in 64 bit con doppia precisione Questi numeri possono essere
Reali, es var1 = -10.7; Immaginari, es var2 = 4i; var3 = 4j; Complessi, es var3 = 10.3 + 10i;

Es: x = [-1.3 3.1+5.3j 0] Le parti reali e immaginarie possono essere positive e negative nellintervallo di valori [10-308, 10308]

- 18 -

Tipo char
Una variabile di tipo char contiene uno scalare o un array di valori a 16 bit (8 bit in Octave), ciascuno dei quali rappresenta un carattere
Es: commento = questa e` una stringa;

Nome della variabile

Array di 1x21 caratteri

(NB: stringhe racchiuse tra apici singoli) whos commento; Name Size Bytes Class Attributes commento 1x21 42 char

- 19 -

Creazione e inizializzazione di una variabile


Le variabili sono create al momento dellinizializzazione Modi di inizializzazione
Assegnamento Lettura dati da tastiera Lettura da file

- 20 -

Assegnamento
variabile = espressione Esempi
contenuto di a a = [0 7+1]; b = [a(2) 5 a]; secondo elemento di a

Risultato
a = [0 8] b = [8 5 0 8]

Non tutti gli elementi devono essere specificati alla creazione


c(2, 3) = 5;
0 0 0 0
- 21 -

0 5

Assegnamento (2) Larray pu essere esteso successivamente


d = [2 5]; d(4)=2; d = [2 5 0 2] 2 5 0 2

Operatore di trasposizione
g = d;

Creare un vettore enumerando i valori di un insieme: uso delloperatore :


x = 1:2:10; n = 1:3; m = [n n] x = [1 3 5 7 9] n = [1 2 3]
1 2 3
- 22 -

1 2 3

Tabella delle funzioni predefinite


Funzione zeros (n) zeros (m,n) zeros (size(arr)) ones(n) ones(m,n) ones(size(arr)) eye(n) eye(m,n) length(arr) size(arr) Significato Genera una matrice nxn di zeri Genera una matrice mxn di zeri Genera una matrice di zeri della stessa dimensione di arr Genera una matrice nxn di uno Genera una matrice mxn di uno Genera una matrice di uno della stessa dimensione di arr Genera la matrice identit nxn Genera la matrice identit mxn Ritorna la dimensione pi lunga del vettore Ritorna un vettore [r c] con il numero r di righe e c di colonne della matrice; se arr ha pi dimensioni ritorna array con numero elementi per ogni dimensione ultimo elemento di vettore v; ultimo elemento dellultima riga di matrice m; la costante end, come indice in un array, denota il pi alto valore possibile dellindice
- 23 -

v(end) m(end, end)

Funzioni predefinite
Esempi
a = zeros(2); b = zeros(2,3);
0 0 0 0 0 0 0 0 0 0

c = [1 2; 3 4]; d = zeros(size(c));

0 0

0 0

- 24 -

sottoarray: applicazione a vettori


Si denota un sottoinsieme di un array usando vettori per valori degli indici
>> v=[6 8 4 2 4 5 1 3] v = 6 8 4 >> v([1 4 7]) ans = 6 2 1 >> v(2:2:6) ans = 8 >> v(3:end-2) ans = 4 >> v(v) ans = >>

primo, quarto settimo elemento 2:2:6 il vettore [2, 4, 6]: indica secondo, quarto, sesto elemento dal terzo al terzultimo elemento

5 i valori di v usati come indice

- 25 -

sottoarray: applicazione a matrici


m = 9 8 7 6 5 4 3 2 1 0 11 12 0 0 0 tutti gli elementi sulle righe 1 e 4 e sulle >> m([1 4], [2 3]) colonne 2 e 3 ans = 8 7 11 12 tutti gli elementi delle righe 1, 3 e 5 >> m(1:2:5, 1:end) ans = 9 8 7 3 2 1 0 0 0 notazione : abbreviata per 1:end, cio tutti i >>>> m(1:2:5, :) valori di quellindice ans = 9 8 7 3 2 1 0 0 0 >> m(2:2:4, :) = [-1 -2 -3; -4 -5 -6]; >> m uso della notazione dei sottoarray per m = 9 8 7 individuare elementi oggetto di assegnamento -1 -2 -3 3 2 1 -4 -5 -6 0 0 0 - 26 >>

Uso di uno scalare per assegnare valori a un array Esempio


m(1:4, 1:3) = 3
3 3 3 3 3 3 3 3 3 3 3 3

Il modo con cui uno scalare viene assegnato a un array dipende dalla forma dellarray che viene specificata a sinistra dellassegnamento Esempio 2 4 4 3
m(1:2, 1:2) = 4
4 3 3 4 3 3 3 3 3

- 27 -

uso dellarray vuoto [] per cancellare elementi di un array


un array vuoto [] assegnato a un elemento di un vettore non crea un buco ma cancella un elemento e ricompatta il vettore un array vuoto [] non assegnabile a singoli elementi di matrici (non si possono creare buchi) assegnabile a intere righe o colonne di matrici, che vengono cancellate (ricompattando la matrice)
>> m=magic(4) m = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> m(3,4)=[] ??? Subscripted assignment dimension mismatch. >> m(3,:)=[] m = 16 2 3 13 5 11 10 8 4 14 15 1 >> [r,c]=size(m) r = 3 c = 4 >> m(:,2)=[] m = 16 3 13 5 10 8 4 15 1 >> [r,c]=size(m) r = 3 c = 3 - 28 -

>> a=[1 2 3 4 5]; >> length(a) ans = 5 >> a(3) ans = 3 >> a(3)=[] a = 1 2 4 >> a(3) ans = 4 >> length(a) ans = 4

Array: memorizzazione Matrici memorizzate


per colonna: colonna 1, poi colonna 2, 3, etc. ogni colonna memorizzata per indici di riga crescenti

Array memorizzati in forma lineare nella RAM variando


pi velocemente i primi indici pi lentamente quelli successivi

NB: opposto a quanto avviene in C


... 1 3 1 3 5 2 4 6 5 2 4 6 ... - 29 -

Array: forma linearizzata


Si pu accedere a un array a pi dimensioni come se ne avesse una sola Usando un unico indice si segue lordine della memorizzazione Da NON usare nella programmazione
ma aiuta a capire certi costrutti....
>> a = [1 2 3; 4 5 6; 7 8 9; 10 11 12] a = 1 2 3 4 5 6 7 8 9 10 11 12 >> a(3, 2) ans = 8 >> a(10) ans = 6 >>
- 30 -

Variabili predefinite
Matlab definisce un insieme di variabili predefinite (es, pi) Queste variabili spesso rappresentano importanti costanti della matematica (pi pigreco, i e j sono sqrt(-1) )
Attenzione! Il valore di queste variabili pu essere modificato, per esempio
circ1=2*pi*10; pi = 3; circ2=2*pi*10;

Il valore di circ2 non sar pi la circonferenza di un cerchio


E` fortemente sconsigliato modificare il valore di una variabile predefinita ( evitare di usare variabili i e j come contatori)

- 31 -

Variabili predefinite pi comuni


Variabile pi i, j inf (o Inf) nan clock date eps ans
Scopo contiene 15 cifre significative di contiene il valore i ( 1 ) rappresentazione dellinfinito (ottenuto di solito come risultato di una divisione per 0) Not-A-Number il risultato di una operazione matematica non definita, es 0/0 contiene la data e lorario corrente. E` un vettore di sei elementi (anno, mese, giorno, ora, minuti, secondi) contiene la data corrente sotto forma di stringa epsilon: la pi piccola differenza rappresentabile tra due numeri Variabile speciale usata per immagazzinare risultati non assegnati ad altre variabili
- 32 -

Operazioni con scalari e array


Operazioni per gli scalari: + - * / ^ Operazioni per gli array
Elevamento a potenza

Array operation: eseguita sugli elementi corrispondenti degli array coinvolti (devono avere lo stesso numero di righe e colonne); si indica aggiungendo un punto prima delloperatore aritmetico a= 1 3 2 4 b= 2 5 3 7 a .* b= 2 6 15 28

Matrix operation: segue le regole dellalgebra lineare (esempio: prodotto righe per colonne) 1 a= 3 2 4 2 b= 5 3 7 12 17 a*b = 26 37

(a * b )ij = k aik * bkj

- 33 -

Operazioni tipiche per gli array


Operazione Array addition Array subtraction Array multiplication Sintassi Commenti Matlab a+b ab a .* b Array e matrix addition sono identiche Array e matrix subtraction sono identiche Ciascun elemento del risultato pari al prodotto degli elementi corrispondenti nei due operandi Prodotto di matrici risultato(i,j)=a(i,j)/b(i,j) risultato(i,j)=b(i,j)/a(i,j) a*inversa(b) inversa(a)*b risultato(i,j)=a(i,j)^b(i,j)
- 34 -

Matrix multiplication Array right division Array left division Matrix right division Matrix left division Array exponentiation

a*b a ./ b a .\ b a/b a\b a .^ b

Matrix left division


Serve per risolvere sistemi di equazioni lineari
a11x1+a12x2+a13x3=b1 a21x1+a22x2+a23x3=b2 a31x1+a32x2+a33x3=b3

pu essere espresso come Ax=B con


a11 a12 a13 A = a21 a22 a23 a31 a32 a33 b1 B= b2 b3 x1 x = x2 x3

di conseguenza, x = A-1B=inversa(A)*b=A\B

- 35 -

Altre funzioni
Funzione ceil(x) floor(x) fix(x) max(x) min(x) mean(x) mod(m,n) round(x) rand(N)
Scopo approssima x allintero immediatamente maggiore approssima x allintero immediatamente minore approssima x allintero pi vicino verso lo zero se x un vettore, ritorna il valore massimo in x e, opzionalmente, la collocazione di questo valore in x; se x matrice, ritorna il vettore dei massimi delle sue colonne se x un vettore, ritorna il valore minimo nel vettore x e, opzionalmente, la collocazione di questo valore nel vettore; se x matrice, ritorna il vettore dei minimi delle sue colonne se x un vettore ritorna uno scalare uguale alla media dei valori di x; se x una matrice, ritorna il vettore contentente le medie dei vettori colonna di x; mod(m,n) m - q.*n dove q = floor(m ./ n) se n ~= 0 approssima x allintero pi vicino genera una matrice di NxN numeri casuali

- 36 -

funzioni min (e anche max) applicate a vettori e matrici


>> b = [4 7 2 6 5] b = 4 7 2 >> min(b) ans = 2 >> [x y]=min(b) x = 2 y = 3 >>

(con un solo risultato) d il valore del minimo con due risultati d anche la posizione del minimo

>> a = [24 28 21; 32 25 27; 30 33 31; 22 29 26] a = 24 28 21 32 25 27 30 33 31 22 29 26 per una matrice d vettore dei minimi nelle colonne >> min(a) ans = 22 25 21 >> [x y]=min(a) x = 22 25 y = 4 2 >> per una matrice, con due risultati d due vettori dei valori minimi nelle colonne e della loro posizione (riga)

21 1

- 37 -

Input/output

Acquisizione dati da tastiera


Funzione input
valore = input(inserisci un valore );

Matlab stampa a video la stringa inserisci un valore ed aspetta di ricevere un dato


Valore scalare Array racchiuso tra [ e ] Stringa racchiusa tra e

Il dato inserito dallutente viene memorizzato nella variabile valore

- 39 -

Stampa dei risultati (1)


I risultati di unoperazione sono mostrati immediatamente se non si inserisce il ; Altri due modi
disp
accetta come parametro un array. Se questo array di tipo char, lo stampa viene usato in congiunzione con num2str Esempio:
str = [il valore di pi e` num2str(pi)]; disp(str);

Stampa: il valore di pi e` 3.1416

- 40 -

Stampa dei risultati (2)


altro modo
fprintf
fprintf(Il valore di pi e` %f \n, pi); stringhe di formato: %d (interi), %e (formato esponenziale), %f (virgola mobile), %g (il pi corto tra il formato esponenziale e quello in virgola mobile)

disp vs. fprintf


disp in grado di stampare anche valori complessi
x=2*(1-2*i)^3; str=[disp: x = num2str(x)]; disp(str);

disp: x = -22+4i fprintf: x = -22.0000

fprintf ne stampa solo la parte reale


fprintf(fprintf: x = %8.4f\n, x);
- 41 -

Lettura e scrittura di dati su file


Tipi di file gestiti
ascii = file di testo .mat = file proprietari di Matlab

Comandi pi semplici da usare


save load

- 42 -

Salvataggio dei dati su file (1)


file .mat
save filename: salva su filename.mat tutte le variabili contenute nello spazio di lavoro save filename array1 array2: salva su filename.mat le variabili array1 e array2

I file .mat hanno un formato compatto Contengono


Nomi, tipi e valori di ogni variabile La dimensione degli array in generale, tutto ci che serve per ripristinare lo stato dello spazio di lavoro Possono essere portati da un computer allaltro, anche con sistemi operativi diversi
- 43 -

Salvataggio dei dati su file (2)


Limitazione dei file .mat E` un formato proprietario di MATLAB. Non utilizzabile per leggere/scrivere dati con un altro programma
Es, un editor di testi, excel,

Soluzione Uso dei file di testo (ascii), esempio


x = [1.23 3.14 6.28; -5.1 7.00 0]; save ascii filename.dat x;

Produce il file filename.dat organizzato come segue


1.2300000e+000 -5.1000000e+000
o

3.1400000e+000 6.2800000e+000 7.0000000e+000 0.0000000e+000

Nota: si pu usare qualsiasi estensione per questi file, buona norma distinguerli dai file .mat
- 44 -

Acquisizione dati da file


load carica dati da file nello spazio di lavoro di MATLAB
load filename: carica nello spazio di lavoro tutte le variabili nel file load filename x y: carica nello spazio di lavoro solo le variabili x ed y Se filename non ha estensione o ha estensione .mat, viene trattato come un file .mat File ascii
load filename.dat: crea una variabile di nome filename che conterr i dati in filename.dat Il file deve contenere dati separati da virgole o spazi

- 45 -

Acquisizione di dati da fogli di calcolo


A = xlsread(filename) importa il file di Microsoft Excel filename.xls nella matrice A Alcuni fogli di calcolo salvano i dati nel formato .wk1
M = wk1read(filename)

per importare questi dati nella matrice M

- 46 -

Script in MATLAB

Script (m-file)
Uno script un file di testo contenente una sequenza di comandi MATLAB
non deve contenere caratteri di formattazione (solo testo puro) viene salvato con estensione .m

I comandi allinterno di uno script sono eseguiti sequenzialmente, come se fossero scritti nella finestra dei comandi
Per eseguire il file si digita il suo nome (senza .m) I risultati appaiono nella finestra dei comandi (se non usiamo il ; )

- 48 -

Vantaggi/Svantaggi
Uno script pu
essere ri-eseguito essere facilmente modificato essere spedito a qualcuno

Uno script NON


accetta variabili di input genera variabili di output

Uno script opera sulle variabili del workspace, che pu essere arricchito introducendone di nuove durante lesecuzione dello script stesso

- 49 -

Come creare uno script


Pu essere creato utilizzando un qualsiasi editor di testo
Ricordarsi di salvare il file come solo testo e di dare lestensione .m Il file di script deve essere presente nella directory corrente o il cammino (path) che identifica la directory in cui si trova lo script deve essere salvato tra i path di Matlab

- 50 -

Nomi degli script

Il nome del file deve cominciare con una lettera e pu contenere cifre e il carattere underscore, fino a 31 caratteri Non dare lo stesso nome al file di script e a una variabile Non chiamare uno script con lo stesso nome di un comando o funzione MATLAB. Per verificare se esiste gi qualcosa che ha un certo nome si pu utilizzare la funzione exist.

- 51 -

Suggerimenti per strutturare e documentare uno script


1. Sezione dei commenti:
Il nome del programma e le parole chiave, nella prima riga La data di creazione e i nomi degli autori nella seconda riga La definizione dei nomi delle variabili per ogni variabile di input e di output Il nome di ogni funzione creata dallutente che viene usata nel programma Il comando help visualizza tutta la sezione dei commenti allinizio dello script

2. Sezione di Input: inserimento dei dati in input e/o uso di funzioni di input 3. Sezione di calcolo 4. Sezione di output: uso si funzioni per visualizzare i risultati del programma
- 52 -

Dati su cui opera uno script file


Gli script non accettano argomenti dentrata e duscita Usano
variabili gi presenti nel workspace variabili acquisite da tastiera o file nuove variabili introdotte nello script

Le variabili interne allo script diventano variabili del workspace


Permangono dopo lesecuzione dello script

- 53 -

Sezione di calcolo
Calcoli matematici Assegnamenti Strutture di controllo
Condizioni Cicli

Comandi per la costruzione di grafici Chiamate a funzioni

- 54 -

Istruzioni della programmazione strutturata: if e while Hanno sintassi simile a quella di C, semantica uguale Vediamo due script che ne fanno uso
%script nel file % quadWhile.m quad=[]; k = 1; while (k <= x) quad (k) = k*k; k=k+1; end; quad %script nel file divisible,m if (mod (x, 2) == 0) fprintf ('even\n'); elseif (mod (x, 3) == 0) fprintf ('divisible by 3\n'); elseif (mod(x,5)==0) fprintf ('divisible by 5\n'); else fprintf ('prime or divisible by x>5\n'); end

>> x=3 x = 3 >> quadWhile quad = 1 4 9 >>

>> x=15 x = 15 >>divisible divisible by 3

>> x=8 x = 8 >>divisible even


- 55 -

>> x=17 x = 17 >> divisible prime or divisible by x>5