giovedì 23 maggio 2013

Problema di Eulero 5


Ebbene si', qui ho barato nel senso che, visto che impiegavo meno tempo a farlo con carta e penna che con il calcolatore, non ho scritto nessun programma.

La formulazione del quinto problema di Eulero e' la seguente
-----------------------------------------------

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
-----------------------------------------------
in pratica basta scrivere
1=1
2=2
3=3
4=2x2
5=5
6=3x2
7=7
8=2x2x2
9=3x3
10=2x5
11=11
12=2x2x3
13=13
14=2x7
15=3x5
16=2x2x2x2
17=17
18=2x3x3
19=19
20=2x2x5

il risultato atteso e' dato da (2x2x2x2)x(3x3)x5x7x11x13x17x19

La soluzione e' 232792560

Problema di Eulero 6

La formulazione del sesto problema di Eulero e' il seguente
----------------------------------------------------------

The sum of the squares of the first ten natural numbers is,
12 + 22 + ... + 102 = 385
The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)2 = 552 = 3025
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum

----------------------------------------------------------

In questo caso l'algoritmo e' molto piu' banale dei casi precedenti ma c'e' sempre da trarre un insegnamento. In C++ la variabili vanno sempre inizializzate

-----------------------------------------------------------

#include <iostream>

using namespace std;

int main()
{
    double somma_quadrati=0;
    int somma=0;
    for (int t=1;t<=100;t++)
    {
        somma = somma + t;
        somma_quadrati = somma_quadrati + (t*t);
        cout << t << endl;
    }
    double quadrato_somma = somma * somma;
    cout.precision(15);
    cout << fixed << (quadrato_somma-somma_quadrati) << endl;

    return 0;
}

-----------------------------------------------------------
La soluzione e' 25164150 con un tempo di calcolo inferiore al decimo di secondo
E' abbastanza chiaro che per ottenere la somma dei numeri inferiori a 100 esiste una formula da Gauss ma visto che comunque un ciclo era previsto, tanto vale sfruttarlo fino in fondo



Problema di Eulero 4


Il quarto problema del Progetto Eulero e' cosi' formulato
------------------------------------------------------
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 ×99.
Find the largest palindrome made from the product of two 3-digit numbers.
------------------------------------------------------

Francamente non sono riuscito a trovare un metodo per capire se un numero e' palindromo senza utilizzare le proprieta' delle stringhe o comunque la posizione del carattere nella stringa

Il programma per il calcolo e' stato il seguente (utilizza una funzione per l'inversione dell'ordine della stringa)
Ovviamente la soluzione e' sovrabbondante in quanto vengono trovati tutti i risultati palindromi per due fattori a tre cifre.
Se si usano come limite 100-999 il tempo di calcolo e' di circa 5 secondi mentre utilizzando  900-999 (senza modificare il risultato finale) il calcolo e' di 0.2 secondi

------------------------------------------------------
#include <iostream>

#include <sstream>
#include <string>

using namespace std;

string reverse(string src) { return string(src.rbegin(), src.rend()); }

int main()
{
    double max = 0;
    for (int t=100;t<1000;t++)
    {
        for (int s=100;s<1000;s++)
        {
            double prodotto = t*s;
            std::ostringstream os;
            os << prodotto;
            std::string str = os.str();
            string rovescia = reverse(str);
            if ((rovescia.compare(str) == 0) && (prodotto > max))
            {
                    max = prodotto;
            }
        }
    }
    cout << "Massimo : " << max << endl;
    return 0;
------------------------------------------------------

La soluzione e' 906609

martedì 21 maggio 2013

Router Telecom e Debian/Linux

Recentemente mi sono imbattuto in un problema curioso. Uno dei bar vicini a dove abito ha aperto la sua wireless lasciando l'access point senza password, in modo che i clienti possano navigare liberamente.Sbirciando sotto il bancone l'access point in questione e' il modello nell'immagine

Il servizio e' carino perche' copre una piazza piuttosto frequentata ed e' comodo per un rapido checkmail da Android.

Tutto ha funzionato bene fino a quando non ho provato a connettermi all'Access Point con una Debian Wheezy installata su un IBM X40. In pratica il portatile non riesce nemmeno ad intercettare l'SSID, le poche volte che aggancia la rete la connessione non fa passare dati

Provando con un mini laptop Samsung N150 Plus sempre con Debian Wheezy la situazione non cambia

Incredibilmente un IBM T61sempre con Debian Wheezy naviga senza nessun problema.

Leggendo su vari forum (per esempio questo) sembra che la colpa sia da attribuire al firmware dell'access point che genera pacchetti non standard e viene data una soluzione. In realta' nel mio caso, a parita' di sistema operativo montato, il problema non e' costante tra i vari portatili

Confrontando i vari moduli di Linux che gestiscono le schede wireless sui vari portatili si scopre che esistono profonde differenze

N150: brcm80211
X40: ipw2100
T61: iwlwifi

per cui, oltre alla gestione dei pacchetti non standard del router, probabilmente anche il modulo Linux che pilota il wireless del portatile puo' generare problemi

Problema di Eulero 3




Il terzo problema del Progetto Eulero e' cosi' formulato
---------------------------------------------

The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
--------------------------------------------------------


Il codice che ho impiegato e' il seguente.
Cosa ho imparato: il programma veniva compilato ed eseguito correttamente (ma con risultati errati) anche sbagliando la definizione della variabile numero; infatti se si definisce long e non long long il programma funziona ma riporta risultati errati...leggere sempre prima il manuale di un linguaggio di programmazione che si conosce poco.
Un paio di trucchi
1) vengono presi in considerazione solo divisori non pari (per ovvi motivi)
2) il ciclo si interrompe a 775147 che e' circa la radice quadrata di 600851475143

------------------------------------------------------------------

#include <iostream>

using namespace std;

int main()
{
long long numero = 600851475143;

for (int t=3;t<775147;t+=2)
{
    if (numero%t == 0)
        {
            numero = numero/t;
            cout << t << endl;
        }
}
    return 0;
}

------------------------------------------------------------------
La soluzione e' 6857

lunedì 20 maggio 2013

Problema di Eulero 2


Il secondo problema del Progetto Eulero e' cosi' formulato
---------------------------------------------
Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

----------------------------------------------

Il programma per il calcolo e' il seguente con soluzione 4613732
------------------------

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int fibo_1 = 0;
    int fibo_2 = 1;
    int fibo = 0;
    int contatore = 1;
    int somma = 0;

    for (fibo = 1; fibo<4000000;fibo++)
    {
      fibo = fibo_1 + fibo_2;
      fibo_2 = fibo_1;
      fibo_1 = fibo;
      contatore++;
      cout << fibo << endl;
      if ((fibo%2)==0){
                            somma = somma + fibo;
                            //cout << "Pari " << contatore%2 << " " << fibo << " " << somma << endl;
                            }
      }

cout << "Somma " << somma << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Installare Oracle JDK in automatico su Debian

Per utilizzare Android Studio e' richiesto l'Oracle Java SDK

Su Debian l'installazione di questo componente di solito viene fatta in modo manuale


Frugando qua e la' ho trovato questo link che permette l'installazione di Oracle SdK in modo automatico sfruttando i repository PPA di Ubuntu

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886
apt-get update
apt-get install oracle-java7-installer

Non e' elegante ma a me ha funzionato

Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...