sabato 30 agosto 2014

Ricerca Operativa e Ultimo Teorema di Fermat equazioni diofantine e ellittiche

Ricerca operativa e UTF:

si consideri il problema di programmazione non lineare intera:

W = min(x^n + y^n -z^n)
st
x, y, z, > 1
n > 2
(x+y)/2 < z < x+y
W >= 0

x, y, z, n > 0
x < z
y < z
x, y, z n: integer


e verificare che la soluzione  W non è mai zero (lo può diventare solo se n = 2)

Per il calcolo si può utilizzare anche  LINGO, LINDO, GAMS, EXCEL, Open Office , Libre Office , Gnunumeric

Teoricamente il metodo è applicabile anche per cercare le soluzioni di altri tipi di equazioni diofantine ad esempio le equazioni ellittiche

venerdì 22 agosto 2014

Punti critici in RSA: tecniche di fattorizzazione intera

n = pq, p, q primi (RSA)

x^2-sx+n=0, s=p+q, x=p, q

s è pari (somma di due numeri primi, quindi dispari)

s^2-4n è multiplo di 4

s^2-4n  è quadrato perfetto

dato che 1^2 = 1, 2^2=4, 3^2=9, 4^2=16, 5^2=25, 6^2=36, 7^2=49, 8^2=56, 9^2=81
allora s^2-4n numero che può avere come ultima cifra solo 0, 4, 6 => riduzione del 40% del calcolo


Nello schema che segue per k=1 è una prova alternativa del fatto che se n=pq, q >p  allora:
 q > sqrt(n), p < sqrt(n)


sabato 16 agosto 2014

Decifrare RSA


inoltre nella scelta dei valori M(n) va considerato che p+q è intero e pari oltre al fatto che 4 | M(n)

In maniera simile si possono considerare gli altri casi
(p-2k-1)(q+2k+1)
(p+2k+1)(q+2k+1) ecc

Nota e approfondimento


giovedì 14 agosto 2014

Un modello matematico che descrive il valore numismatico di una moneta

k = numero di monete nel mercato
v = valore numismatico delle k monete

kv = (k-x)y

x= numero delle monete distrutte
y = prezzo delle monete dopo la distruzione delle x monete

funzione di utilità
U = (k1-x)y-k1*v > 0
k1 monete che avevo
x= monete che ho distrutto tra le k1 monete
k1 > x


mercoledì 13 agosto 2014

L'equazione del debito/pil

Debito/Pil  =3/100

Debito = D
Pil = P

Z = (D+x*D/100) / (P+y*P/100 ) = D(100+x)/[P(100+y)] 
Z = (D/P)[(100+x)/(100+y)] = k [(100+x)/(100+y)]
x = variazione percentuale del debito
y = variazione percentuale del PIL
-100 < x < 100
-100 < y < 100

Z = k(100+x)/(100+y), dove k = 4/100, 3 /100, 2/100,.......
Z=Z(x,y) funzione in due variabili che può essere facilmente descritta con un grafico con il Mathematica in 3D per ogni k fissato (curve di livello)


Con lo studio di questi grafici e con la funzione descritta possiamo stabilire di quanto può aumentare il debito pubblico e di quanto deve aumentare il Pil per rimanere nei parametri del 3%, oppure se volete cose succede se diminuisce troppo il Pil e il debito

esempio se ora l'italia  è D/P = 2.6/100 allora k = 2,6/100 e Z = [(100+x)/(100+y)] e lo studio della funzione in due variabili x, y ci dice quanta variazione del debito possiamo permetterci in base alle previsioni di variazione del Pil.

k = D/P (valore iniziale di riferimento debito/pil)

come ulteriore applicazione partendo sempre da   Z = (2.7/100) [(100+x)/(100+y)] < 3/100  (limite imposto da non superare) ottenendo una disequazione nel piano (x,y) e quindi si può disegnare in un piano XY la "regione della manovra" e dei possibili scenari

martedì 12 agosto 2014

Alla ricerca dei numeri Taxicab

Generare una lista di numeri primi in Java

ECCO UN PROGRAMMA CHE GENERA UNA LISTA (ANCHE INFINITA) DI NUMERI PRIMI USANDO LE POTENZA DEL JAVA


package primi3;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.*;

public class Main {

    public static void main(String[] args) {
        float j = 1;
         BigInteger primo = new BigInteger("900");
        while(j<= 10000){
            primo = primo.nextProbablePrime();
            System.out.print(primo);
            System.out.println("--");
            
           j =j+1;
        }
    }

}


I numeri Repunit (alla ricerca dei Repunit primi)


R(n) = numero repunit
R(n) = (10^n-1)/9

R(n) primo => n primo
n primo =\> R(n) primo


----
CODICE IN PARI/GP

{repunit(b) =local(R);
i = 2;
while (i <= b, R = (10^i-1)/9; if(isprime(R)==1, print(i); print(R); print("--------")); i = nextprime(i+1));
}


{repunit2(b) =local(R);
i = 3;
while (i <= b, R = (10^i-1)/9; if(isprime(R)==1, print(i); print(R); print("--------"); i = i+2);
}

----

CODICE IN JAVA CON LIBRERIA BIG NUMBERS

import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.*;
public class Main {
    public static void main(String[] args) {
       int j = 3;
       long max = 1000;
       BigInteger R = new BigInteger("1");
       BigInteger uno = new BigInteger("1");
        BigInteger base = new BigInteger("10");
        BigInteger base1 = new BigInteger("9");
       while(j<= max){
           R = (base.pow(j));
           R = R.subtract(uno);
           R = R.divide(base1);
           if( R.isProbablePrime(1000))
           {
               System.out.println(R);
               System.out.println(j);
               System.out.println("------");
             }
        j = j+2;
       }

    }

domenica 10 agosto 2014

La distribuzione dei primi: funzioni a confronto

Usando il Mathematica


Table[N[x/Log[x]], {x, 2, 100}]
Table[NIntegrate[t/Log[t], {t, 2, x}], {x, 2, 10}]
ListPlot[%]
Table[Prime[n], {n, 1, 100}]

sabato 9 agosto 2014

Il calcolo del Pi greco attraverso il pendolo


T = periodo del pendolo
g = acc di gravità
L = lunghezza del pendolo
alfa = angolo iniziale con la verticale

martedì 5 agosto 2014

Costruire una password con l'hash

- A e B devono concordare una password comune per inviare un file protetto
- A e B concordano in modo segreto tra di loro una lista di N frasi da 1  a N
- A invia a B il numero della frase che ha scelto esempio la n. 6
- Calcola l'hash della frase numero 6 e B calcola l'hash della frase n. 6 ottenendo entrambi lo stesso risultato.
L'hash è la password comune fatta a caratteri alfanumerici

L'algoritmo di hash concordato può vairare es sha1, sha2, md5, ecc

I programmi per calcolare l'hash sono facilmente reperibili on line


Scomposizione in fattori: metodi semplici ma efficaci

lunedì 4 agosto 2014

Programmi in PHP: numeri casuali e hash


Algoritmo per generare numeri casuali senza ripetizioni

Il seguente algoritmo genera numeri casuali da 1 a 90 senza ripetizioni


Module Module1

    Sub Main()
        Dim num As Integer
        Console.WriteLine("quanti numeri vuoi generare ?")
        num = Console.ReadLine()
        Dim arr(90) As Integer
        Dim contatore As Integer
        contatore = 0
        Dim i As Integer
        For i = 1 To 90
            arr(i) = 0
        Next
        While (contatore <= num)
            Dim generator As New Random
            Dim randomValue As Integer
            randomValue = generator.Next(1, 90)
            If (randomValue <> arr(randomValue)) Then
                Console.WriteLine(randomValue)
                arr(randomValue) = randomValue
                contatore = contatore + 1
            End If
        End While
        Console.WriteLine(" inserisci un carattere per finire ")
        Dim f As Char
        f = Console.ReadLine()

    End Sub

End Module