2025(e)ko martxoaren 2(a), igandea

7. jarduera (I) | Zenbaki bat asmatzen

ZER DAKIDAN:
Funtzioak erabiliz algoritmoak programatzen badakit.



ZER IKASIKO DUDAN:
Joko bat programatuko dut, erabiltzaileak zenbaki bat zehaztu eta programak asmatuko dio.


Guk pentsaturiko zenbakia ordenadoreak asmatuko digu

0 eta 100 bitartean dagoen zenbaki osoa pentsatuko dugu eta ordenagailuak galdera batzuk eginez zenbaki hori asmatuko digu. Saiakera bakoitzeko, ordenagailuari informazioa emango diogu esanez zenbaki ezezaguna zein tartetan dagoen.

  1. Zenbaki oso bat pentsatu dugu, hots, 0 eta 100 bitartean dagoen zenbaki osoa pentsatu dugu
  2. Ezezaguna den zenbakiaren heina [0, 100] da hasieran, behemuga 0 eta goimuga 100. Beraz, iBehemuga:=0 eta iGoimuga:=100
  3. Errepikatu zenbakia asmatu arte edo 7 saiakera egin arte:
    • Programak proposatuko digun soluzioa kalkulatuko du, soluzioa: baligarria den heinaren erdia. Beraz, iSoluzioa := (iBehemuga + iGoimuga) div 2
    • Programak galdetuko digu proposatu duen soluzioa egokia den ala ez, aukerak:
      • B, bai, proposatu digun zenbakia guk pentsatu duguna izan da (begiztatik irten)
      • H, ez, proposatu digun zenbakia ez da guk pentsatutakoa, proposatu digun zenbakia gurea baino handiagoa da (heinaren iGoimuga aldatu eta 3. urratsaren hasierara itzuli saiakera berri bat egiteko)
      • T, ez, proposatu digun zenbakia ez da guk pentsatutakoa, proposatu digun zenbakia gurea baino txikiagoa da (heinaren iBehemuga aldatu eta  3. urratsaren hasierara itzuli saiakera berri bat egiteko)
  4. Emaitza erakutsi, begiztatik irteteko aukerak:
    • Gure erantzuna B izan denez, ordenagailuak gure zenbakia asmatu du: iSoluzioa erakutsi
    • Saiakerak 7 baino gehiago izan dira, horrek esan nahi du ez dugula zuzen jokatu eta gure erantzunetan gezurra esan diogula programari
  Zergatik 7 saiakera?
  0-tik 100-ra, biak barne, 101 aukera. Urrats bakoitzean,
  aukera guztietatik erdiak baztertzen dira. Beraz:
log2(101)=6,658
  logaritmo (2 oinarrian) 101 zenbakiarena 6,658 da
  2x = 101   >>>   ln(2x) = ln(101)   >>>
  x·ln(2) = ln(101)   >>>   x = ln(101)/ln(2)
  x = 4.61512/0.69315 = 6.65821   >>>   x=7   

Hona hemen programaren balizko exekuzio bat:



Eskatzen den programa jarraian erakusten da. Antzeko algoritmoa aplikatzen da 7. jarduera (II) | Letra bat asmatzen ariketan, non makinak letra bat aukeratzen duen eta guk asmatu behar dugun.

/* 7a-Jarduera_ZenbakiBatAsmatzen: erabiltzaileak zenbakia finkatu
                                   eta programak asmatuko du. */

// 0-tik 100-era dauden aukerak 101 dira guztira
// log (oinarria 2) 101 zenbakiarena = 6,6438
// horregatik 7 saiakerekin ziur asmatzen dela

#include <stdio.h>
#include <stdlib.h>   // system() funtziorako
#include <conio.h>    // getch() funtziorako
#include <ctype.h>    // toupper() funtziorako

#define SAIAKERAMUGA 7

void HasierakoMezua();
char cKonparaketarenEmaitza(int iSoluzioa, int iSaiakera);
void EmaitzaErakutsi(char cErantzuna, int iSoluzioa);


int main()
{
    int iSoluzioa, iSaiakera, iBehemuga, iGoimuga;
    char cErantzuna;

    HasierakoMezua();
    system("cls");

    iBehemuga = 0;          // hasieraketak
    iGoimuga = 100;
    iSoluzioa = (iGoimuga + iBehemuga) / 2;
    iSaiakera = 1;

    // bilaketa bitarraren algoritmoa
    do
    {
        printf("\n");
        cErantzuna = cKonparaketarenEmaitza(iSoluzioa, iSaiakera);

        if (cErantzuna == 'H')
            iGoimuga = iSoluzioa - 1;
        else
            if (cErantzuna == 'T')
                iBehemuga = iSoluzioa + 1;

        iSoluzioa = (iGoimuga + iBehemuga) / 2;
        iSaiakera++;
    } while (cErantzuna != 'B' && iSaiakera <= SAIAKERAMUGA);

    printf("\n\n");
    EmaitzaErakutsi(cErantzuna, iSoluzioa);

    printf("Irteteko edozein tekla sakatu.");
    getch();
    return 0;
}


// hasierako mezua erakusten duen funtzioa
void HasierakoMezua()
{
    system("cls");
    printf("0 eta 100 artean aurkitzen den zenbaki bat pentsa ezazu eta hainbat galdera\n");
    printf("eginez ordenadoreak zenbakia asmatuko dizu. Galdereetako erantzunetan zuzen\n");
    printf("jokatuz eta gezurrik esaten ez baduzu, programak 7garrenerako asmatuko du.\n\n");
    printf("Aurrera egiteko edozein tekla sakatu...\n\n");
    getch();
}


// zenbakia konparatzen duen funtzioa
char cKonparaketarenEmaitza(int iSoluzioa, int iSaiakera)
{
    char cErantzuna;

    printf("%d. saiakeran ordenadoreak aukeratutako zenbakia: %d\n", iSaiakera, iSoluzioa);
    printf("%d zenbakia zurearekin konparatuta, nolakoa da?\n", iSoluzioa);
    printf("                 B  Berdina\n");
    printf("                 H  Handiagoa\n");
    printf("                 T  Txikiagoa\n");

    do
    {
        printf("Erantzuna: ");
        cErantzuna = getch();
        printf("%c\n", cErantzuna);
        cErantzuna = toupper(cErantzuna);
    } while (cErantzuna != 'B' && cErantzuna != 'H' && cErantzuna != 'T');

    return cErantzuna;
}


// azken emaitza erakusten duen funtzioa
void EmaitzaErakutsi(char cErantzuna, int iSoluzioa)
{
    if (cErantzuna == 'B')
        printf("Pentsatu duzun zenbakia %d da.\n", iSoluzioa);
    else
        printf("Erantzunetan okertu zara ala gezurti hutsa zara\n");
}






  • 7a-Jarduera_ZenbakiBatAsmatzen.cbp | main.c  
  • 7b-Jarduera_LetraBatAsmatzen.cbp | main.c  


 

6. jarduera (V) | Pi zenbakia: Ramanujan (1914)








Srinivāsa Aiyangār Rāmānujan, tamileraz : ஸ்ரீனிவாஸ ஐயங்கார் ராமானுஜன், (Erode, 1887ko abenduaren 22a - Kumbakonam, 1920ko apirilaren 26a) indiar matematikari oso enigmatiko bat izan zen. Zenbaki-teoriaren alorrean eragin handiko lana egin zuen. Ramanujan jakinduria handiko matematikaria izan zen, baina ezagutza gehiena irakaslerik gabe lortu zuenez gero, zenbait gaitan ezjakina zen, eta beste batzuei buruz inork baino gehiago zekien.


Ramanujanen lan nagusiak haren koadernoetan daude, nomenklatura eta notazio berezian berak idatzita, frogarik gabe; eta horrek deszifratze eta eraikitze lan zaila eragin du, oraindik bukatu gabea. π zenbakiak liluratuta, algoritmo indartsu batzuk garatu zituen hura kalkulatzeko.

Ramanujanek lan egin zuen, batez ere, zenbakien teoria analitikoan eta famatu egin zen hainbat formula batukariengatik; esaterako, π gisako konstanteei eta logaritmo naturalen oinarriari dagozkionak.

π konstantearen balioak kalkulatzeko arku tangente formulak erabili ziren, baina ikusi zen bide horrek mugak zituela eta beste algoritmo ahaltsuagoak behar zirela. Lehen soluzioa 1914. urtean heldu zen Ramanujan matematikariak bere segida proposatu zuenean eta honi esker π konstantearen 17.526.200 hamartar lortu ziren.

Hau da Ramanujanen segida π konstantearen hamartarrak kalkulatzeko:


Segida honen ezaugarririk garratzitsuena honako hau da: batukariari batzen zaion batugai berriak 8 hamartar gehiago gehitzen dizkio π zenbakiaren kalkuluari.

C lengoaian idatzitako programa bat jarraian erakusten da:

/* 6d-Jarduera_PIzenbakiaRamanujan */
//------------------------------------------------------------------------------
//  Ramanujanen segida PI kalkulatzeko.
//  Faktorialen eta berreketen batukaria da.
//------------------------------------------------------------------------------

#include <stdio.h>
#include <math.h>

#define K (2 * sqrt(2) / pow(99, 2))

double fnrFaktoriala(int iZbk);
double fnrBerreketa(int iZbk);

int main() {
    double rSegida, rBatugaia, rZatikizuna, rZatitzailea, rDoikuntza;
    int iKont;

    printf("//////////////////////////////////////\n\n");
    do {
        printf("Kalkuluaren doikuntza eman (adibidez, 0.000000000000001): ");
        scanf("%lf", &rDoikuntza);
    } while (rDoikuntza <= 0.0);

    printf("\n");

    rSegida = K * 1103;  // iKont = 0 denean, batugaia kanpoan
    iKont = 1;

    do {
        rZatikizuna = fnrFaktoriala(4 * iKont) * (1103 + 26390 * iKont);
        rZatitzailea = fnrFaktoriala(iKont) * fnrFaktoriala(iKont) * fnrFaktoriala(iKont) * fnrFaktoriala(iKont) * fnrBerreketa(4 * iKont);

        rBatugaia = rZatikizuna / rZatitzailea;
        rSegida += rBatugaia;

        printf("iKont = %2d rSegida = %16.14f rBatugaia = %17.14f\n", iKont, rSegida, rBatugaia);
        iKont++;
    } while (rBatugaia >= rDoikuntza);

    printf("\n");
    printf("  rSegida = %20.20f\n", rSegida);
    printf("\n");
    printf("1/rSegida = %20.20f (Ramanujan)\n", 1.0 / rSegida);
    printf("       PI = %20.20f\n", M_PI);

    printf("\n");
    printf("//////////////////////////////////////\n");

    return 0;
}


double fnrFaktoriala(int iZbk) {
    double rMetatua = 1.0;
    for (int k = 1; k <= iZbk; k++) {
        rMetatua *= k;
    }
    return rMetatua;
}


double fnrBerreketa(int iZbk) {
    double rMetatua = 1.0;
    for (int k = 1; k <= iZbk; k++) {
        rMetatua *= 369.0;
    }
    return rMetatua;
}





Srinivāsa Rāmānujan matematikaria aipatzen ari garela, duela gutxi EiTBk film hau programatu du:


Irudiaren gainean klik egin filmaren Trailer Ofiziala ikusteko






  • 6d-Jarduera_PIzenbakiaRamanujan.cbp | main.c


 

6. jarduera (IV) | Pi zenbakia: Euler (1734, 1738)







Leonhard Euler (Basilea, Suitza, 1707ko apirilaren 15a - San Petersburgo, Errusia, 1783 irailaren 18a) matematikaria eta fisikaria izan zen. Historiako matematikari handienetakoa, Arkimedesekin, Newtonekin, Leibnizekin eta Gaussekin batera; eta, argitaratutako lan kopuruari begiratuz gero, emankorrena, dudarik gabe. Orduko matematika-arlo ia guztietan ekarpen garrantzitsuak egiteaz gain terminologia eta notazio matematiko modernoaren sortzaileetakoa izan zen.



Eulerren formulak hartzen duen izena, Leonhard Eulerren omenez izan zen. Formula hau analisi konplexu arloko matematika-formula bat da, funtzio trigonometrikoen eta funtzio esponentzialen arteko erlazio sakona erakusten duena (Eulerren identitatea Eulerren formularen kasu berezi bat da).

,

non :

x zenbaki erreala den;
e logaritmo naturalaren oinarria den;
i unitate irudikaria den;
sin eta cos funtzio trigonometrikoak diren.

 


1734

1734. urtean Eulerrek formula hau proposatu zuen π konstantearen balioa kalkulatzeko:
Tamalez segida horren konbergentzia oso motela da, C lengoaian idatzitako hurrengo programan ikus daitekeen bezala:
/* 6c-Jarduera_PIzenbakiaEuler1 */
//------------------------------------------------------------------------------
//  Eulerren formula PI kalkulatzeko:
//      PI^2 = 6*(1/1^2 + 1/2^2 + 1/3^2 + 1/4^2 + ...) 
//  zoritxarrez segida honen konbergentzia oso motela da
//------------------------------------------------------------------------------

#include <stdio.h>
#include <math.h>

#define MUGA 0.000000001

int main() {
    double rSegida, rBatugaia, rDoikuntza;
    int iKont;

    printf("//////////////////////////////////////\n\n");

    do {
        printf("Kalkuluaren doikuntza eman (ehunmiloaren adibidez, 0.00000001): ");
        scanf("%lf", &rDoikuntza);
        if (rDoikuntza < MUGA) {
            printf("Doikuntza %.9f baino handiagoa izan dadila!\n", MUGA);
        }
    } while (rDoikuntza <= 0.0);

    printf("\n");

    rSegida = 1.0;   // lehen batugaia kanpoan
    iKont = 2;

    do {
        rBatugaia = 1.0 / (iKont * iKont);
        rSegida += rBatugaia;
        printf("iKont = %5d rSegida^2 = %16.14f rBatugaia = %17.14f\n", iKont, rSegida, rBatugaia);
        iKont++;
    } while (rBatugaia >= rDoikuntza);

    rSegida *= 6;

    printf("\n");
    printf("rSegida^2 = %16.10f\n", rSegida);
    printf("\n");
    printf("  rSegida = %16.10f\n", sqrt(rSegida));
    printf("       PI = %16.10f\n", M_PI);

    printf("\n");
    printf("//////////////////////////////////////\n");

    return 0;
}




1738

1738. urtean funtzio trigonometrikoen formula hau proposatu zuen Eulerrek π konstantearen balioa kalkulatzeko:
arc tan (1) = arc tan (1/2) + arc tan (1/3) =  π/4

Hona hemen, formularen azalpena. Ikusi lehenik eta behin, eskumako irudian ematen diren bi triangeluak antzekoak direla: biek 90ºko angelu bat daukate, eta bi triangeluetan angelu txikienaren tangenteak 1/2 balio dute.



Triangelu handian hau betetzen da:
  • angelu handia = 90º
  • angelu ertaina = c + 45º
  • angelu txikia = b

Hiru angeluak bilduz:   90º + (c + 45º) + b = 180º
Beraz, triangelu handian hau betetzen da b + c + 45º = 180 - 90º eta horregatik b + c = 45º betetzen da ere.

Baina, b = arc tan (1/2) eta c = arc tan (1/3) eta 45º=π/4 direlako, hiru balio horiek goiko ekuaziora eramanez π lor daiteke  arc tan (1/2) + arc tan (1/3) = π/4  bi konstanteen arku tangenteak ezagunak direlako.

Hau izan daiteke C lengoaian idatzitako programa:
/* 6c-Jarduera_PIzenbakiaEuler2 */
//------------------------------------------------------------------------------
//  Eulerren formula PI kalkulatzeko:
//      atan(1) = atan(1/2) + atan(1/3) =  π/4
//------------------------------------------------------------------------------

#include <stdio.h>
#include <math.h>

int main() {
    double rPIlaurden;

    printf("//////////////////////////////////////\n\n");

    rPIlaurden = atan(1.0 / 2.0) + atan(1.0 / 3.0);

    printf("rPIlaurden = %.20f\n", rPIlaurden);
    printf("\n");
    printf("PI (Euler) = %.20f\n", rPIlaurden * 4);
    printf("        PI = %.20f\n", M_PI);

    printf("\n");
    printf("//////////////////////////////////////\n");

    return 0;
}





  • 6c-Jarduera_PIzenbakiaEuler1.cbp | main.c
  • 6c-Jarduera_PIzenbakiaEuler2.cbp | main.c


 

6. jarduera (III) | Pi zenbakia: Leibniz (1674)








Gottfried Wilhelm Leibniz, (Leipzig, 1646ko uztailaren 1a – Hannover, 1716ko azaroaren 14a) alemaniar filosofo, matematikari, logikari, teologo, jurista, liburuzain eta politikaria izan zen.


XVII. eta XVIII. mendeetako pentsalari handienetakoa izan zen, azken jenio unibertsal gisa ezaguna (bere osteko guztiak "ezpezialistak" izan omen dira). Metafisika, epistemologia, logika, erlijioaren filosofia, matematika, fisika, geologia, legegintza eta historiaren alorretan, ekarpen sakon eta garrantzitsuak egin zituen.

Filosofiaren historian zein matematikarenean figura esanguratsua da. Newtonen lanarekiko paralelo, kalkulu infinitesimala garatu zuen, notazio eta guzti, ordutik erabiltzen dena. Sistema bitarra ere asmatu zuen, egungo ordenagailuen oinarri birtuala dena.

Bestalde, Leibnizek teknologian ekarpenak egin zituen, bai eta biologian, medikuntzan, geologian, probabilitate teorian, ingeniaritzan eta konputazio zientzietan ere.

Hau da Leibniz segida π konstantearen hamartarrak kalkulatzeko:


Baina soluzioak arazo bat du, 19 milioi termino batu behar dira 7 hamartar zuzen lortzeko. Argi utz dezagun formula horiek aurkitu izana meritu handia dela, nahiz eta praktikan ez diren baliagarriak π zenbakiaren hamartarrak zehaztasunez kalkulatzeko.

Jarraian π zenbakiaren segidari dagokion programa bat C lengoaian idatzirik:

/* 6b-Jarduera_PIzenbakiaLeibniz */
//------------------------------------------------------------------------------
//  Leibnizen formula PI kalkulatzeko:
//      PI/4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...
//  zoritxarrez segida honen konbergentzia oso motela da
//------------------------------------------------------------------------------

#include <stdio.h>
#include <math.h>

#define MUGA 0.0001

int main() {
    double rSegida, rBatugaia, rDoikuntza;
    int iKont, iZeinua;

    printf("//////////////////////////////////////\n\n");

    do {
        printf("Kalkuluaren doikuntza eman (milaren adibidez, 0.001): ");
        scanf("%lf", &rDoikuntza);
        if (rDoikuntza < MUGA) {
            printf("Doikuntza %.4f baino handiagoa izan dadila!\n", MUGA);
        }
    } while (rDoikuntza < MUGA);

    printf("\n");

    rSegida = 1.0;   // lehen batugaia kanpoan
    iZeinua = -1;
    iKont = 3;

    do {
        rBatugaia = iZeinua * 1.0 / iKont;
        rSegida += rBatugaia;
        printf("iKont = %5d rSegida = %16.12f rBatugaia = %17.12f\n", iKont, rSegida, rBatugaia);
        iKont += 2;
        iZeinua = -iZeinua;
    } while (fabs(rBatugaia) >= rDoikuntza);

    printf("\n");
    printf("  rSegida = %16.12f\n", rSegida);
    printf("\n");
    printf("rSegida * 4 = %16.12f (Leibniz)\n", 4 * rSegida);
    printf("       PI = %16.12f\n", M_PI);

    printf("\n");
    printf("//////////////////////////////////////\n");
    
    return 0;
}







  • 6b-Jarduera_PIzenbakiaLeibniz.cbp | main.c


 

6. jarduera (II) | Pi zenbakia: Wallis (1655)








John Wallis, (Ashford, 1616 - Oxford, 1703) ingeles matematikaria zen Cambridgen egin zituen ikasketak.


1640an apaiz egin zen, eta 1649an Oxfordeko geometria-irakasle izendatu zuten. Zirkuluaren koadraturari buruzko azterketak egin zituen. Berak asmatua da infinitua irudikatzeko sinboloa (∞). Arithmetica infinitorum, Wallisen lanik garrantzitsuena, 1656an argitaratu zen. Tratatu horretan Descartesen eta Cavalieriren analisi-metodoak sistematizatu eta hedatu egin zituen.

Wallisek ekarpen esanguratsuak egin zizkion trigonometriari, kalkuluari, geometriari, eta serie infinituen analisiari. Opera Mathematica I (1695) lanean, frakzio jarraitua terminoa sartu zuen.

Bestalde, π konstantearen hamartarrak kalkulatzeko segida bat proposatu zuen Wallisek 1655ean, Wallisen biderkadura deritzona, oso segida estetikoa da baina ez da eraginkorra hamartarrak lortzean iterazio asko behar dituelako. Wallisen biderkadura hainbat biderkagaiz osaturik dago eta biderkagaiak bikoteka antolatzen dira.

Hau da Wallisen biderkadura segida π konstantearen hamartarrak kalkulatzeko:

Jarraian ematen diren hiru programetan ikusiko da π konstantearen hamartarrak kalkulatzeko, Wallisen biderkadurak konputazio-karga handia behar duela. Baina, argi utz dezagun formula hori aurkitu izana meritu handia dela, nahiz eta praktikan ez den baliagarria π zenbakiaren hamartarrak zehaztasunez kalkulatzeko.

Jarraian π zenbakiaren hamartarrak kalkulatzen dituen Wallisen biderkadura segidaren hiru adibide-programa erakutsiko dira, baina lehenik segidaren ezaugarriak azter ditzagun.




Ikusten denez, segidaren biderkagaiek ondoko hauek betetzen dituzte: 
  1. Biderkagaiak binaka antolaturik datoz
  2. Bikote bakoitzean, jarraian doazen hiru kopuru agertzen dira:
    • Lehen bikotean, 1-2-3
    • Bigarren bikotean, 3-4-5
    • Hirugarren bikotean, 5-6-7
    • Laugarren bikotean, 7-8-9
    • Bosgarren bikotean, 9-10-11
    • ...
  3. Bikoteen balioak kalkulatuz, zatidura gero eta hurbilago dago 1.0 zenbakitik:
    • Lehen bikotearen emaitza 4/3=1.333 da
    • Bigarren bikotearen emaitza 16/15=1.066 da
    • Hirugarren bikotearen emaitza 36/35=1.028 da
    • Laugarren bikotearen emaitza 64/63=1.016 da
    • Bosgarren bikotearen emaitza 100/99=1.010 da
    • ...
  4. Bikote baten balioa kalkulua esleipen honetan erakusten da, non iKont aldagaia goiko irudiaren zenbaki urdina litzatekeen:
    rBikotea := ((iKont+1)/(iKont))*((iKont+1)/(iKont+2));
    • Lehen bikotean, iKont=1 eta rBikotea=4/3
    • Bigarren bikotean, iKont=3 eta rBikotea=16/15
    • Hirugarren bikotean, iKont=5 eta rBikotea=36/35
    • Laugarren bikotean, iKont=7 eta rBikotea=64/63
    • Bosgarren bikotean, iKont=9 eta rBikotea=100/99
    • ...


Demagun biderkagaien kopurua ezaguna dela programan. Adibidez, teklatuaren bitartez bikoteen iZenbat kopurua irakurtzen delako (5 eta 500 arteko balio osoa). Hauxe izan daiteke, C lengoaian idatzirik, lehen bertsioaren programa bat:
/* 6a-Jarduera_PIzenbakiaWallis1 */
//------------------------------------------------------------------------------
//  PI kalkulatzeko, bikote kopurua ezaguna da (5 eta 500 artekoa):
//                        1         3         5         7          9
//    PI/2 = rPIerdi = 2/1*2/3 * 4/3*4/5 * 6/5*6/7 * 8/7*8/9 * 10/9*10/11 * ...
//    PI/2 = rPIerdi =   4/3   *  16/15  *  36/35  *  64/63  *  100/99    * ...
//    PI/2 = rPIerdi =  1.333  *  1.066  *  1.028  *  1.016  *   1.010    * ...
//------------------------------------------------------------------------------

#include <stdio.h>

int main() {
    double rPIerdi, rBikotea;
    int iZenbat, iKont;

    do {
        printf("Zenbat bikote hartuko dira PI kalkulatzeko? Adibidez 5 eta 500 artekoa: ");
        scanf("%d", &iZenbat);
        if (iZenbat < 5 || iZenbat > 500) {
            printf("Bikoteen kopurua 5 eta 500 artekoa izan dadila.\n");
        }
    } while (iZenbat < 5 || iZenbat > 500);
    
    printf("\n");

    iKont = 1;
    rBikotea = ((double)(iKont + 1) / iKont) * ((double)(iKont + 1) / (iKont + 2));
    rPIerdi = rBikotea;

    printf("iKont=%3d rBikotea=%18.8f PI=%12.8f\n", iKont, rBikotea, rPIerdi);
    printf("-------------------------------------------------------------------------------\n");

    for (iKont = 2; iKont <= iZenbat * 2; iKont++) {
        if (iKont % 2 == 1) {
            rBikotea = ((double)(iKont + 1) / iKont) * ((double)(iKont + 1) / (iKont + 2));
            rPIerdi *= rBikotea;
            printf("iKont=%3d rBikotea=%18.8f PI=%12.6f\n", iKont, rBikotea, 2 * rPIerdi);
        }
    }

    printf("\n");
    printf("%10d iterazio ondoren: PI=%12.6f\n", iZenbat, 2 * rPIerdi);
    printf("\n");

    return 0;
}

Goiko programa birritan exekutatzean lor daitezkeen pantaila-ireteerak:

iZenbat datuak 16 balio du eta π konstantearen hamartarrak 3.094359 dira
iZenbat datuak 500 balio du eta π konstantearen hamartarrak 3.140024 dira


Demagun biderkagaien kopurua ezezaguna dela programan. Prozesu errepikakorretik irteteko daukagun datua da azken bikotearen balioa 1.0 konstantetik oso hurbil dagoela. Beraz, rEpsilon hurbiltasunaren maila teklatuz emanik (0.0000010 baino handiagoa adibidez), iterazio batean rBikotea-1.0 adierazpenaren balioa rEpsilon baino txikiagoa bihurtzen bada prozesu errepikakorra eteteko da.

Hauxe izan daiteke, C lengoaian idatzirik, bigarren bertsioaren programa bat while egituraz kodeturik (ariketa hau programatu daiteke ere do-while egitura erabiliz):

/* 6a-Jarduera_PIzenbakiaWallis2 */
//------------------------------------------------------------------------------
//  PI kalkulatzeko, azken bikotea 1.0-tik oso oso hurbil izan dadila:
//                        1         3         5         7          9
//    PI/2 = rPIerdi = 2/1*2/3 * 4/3*4/5 * 6/5*6/7 * 8/7*8/9 * 10/9*10/11 * ...
//    PI/2 = rPIerdi =   4/3   *  16/15  *  36/35  *  64/63  *  100/99    * ...
//    PI/2 = rPIerdi =  1.333  *  1.066  *  1.028  *  1.016  *   1.010    * ...
//------------------------------------------------------------------------------

#include <stdio.h>

int main() {
    double rPIerdi, rBikotea, rEpsilon;
    int iKont;

    do {
        printf("Eman azken bikotearen hurbiltasuna 1.0-tik (adibidez: 0.0000011): ");
        scanf("%lf", &rEpsilon);
        if (rEpsilon <= 0.0000010) {
            printf("Azken bikotea 1.0-tik hurbil dago, diferentzia 0.0000010 baino handiagoa.\n");
        }
    } while (rEpsilon <= 0.0000010);

    printf("\n");

    iKont = 1;
    rBikotea = ((double)(iKont + 1) / iKont) * ((double)(iKont + 1) / (iKont + 2));
    rPIerdi = rBikotea;

    printf("iKont=%3d rBikotea=%13.8f PI=%8.8f rEpsilon=%15.7f\n", iKont, rBikotea, rPIerdi, rEpsilon);
    printf("-------------------------------------------------------------------------------\n");

    while (rBikotea - 1.0 > rEpsilon) {
        iKont += 2;
        rBikotea = ((double)(iKont + 1) / iKont) * ((double)(iKont + 1) / (iKont + 2));
        rPIerdi *= rBikotea;
        printf("iKont=%3d rBikotea=%13.8f (rBikotea-1.0)=%19.8f PI=%8.6f\n", iKont, rBikotea, (rBikotea - 1.0), 2 * rPIerdi);
    }

    printf("\n");
    printf("%10d iterazio ondoren:        iKont=%3d PI=%12.6f\n", (iKont / 2), iKont, 2 * rPIerdi);
    printf("\n");

    return 0;
}

Goiko programa bi aldiz exekutatzean lor daitezkeen emaitzak:

rEpsilon datuak 0.001 balio du eta π konstantearen hamartarrak 3.094359 dira
rEpsilon datuak 0.0000011 balio du eta π konstantearen hamartarrak 3.139948 dira


Demagun biderkagaien kopurua ezezaguna dela programan. Prozesu errepikakorretik irteteko daukagun datua da, azken bi bikoteen balioen arteko diferentzia txikia dela (0.00000010 baino handiagoa adibidez), iterazio batean rOraingoBikotea aldagaiari balioa ematen zaio eta aurreko iterazioaren rAurrekoBikotea balioarekin kenketa egiten da, eta kendura rEpsilon baino txikiagoa bihurtzen bada prozesu errepikakorra eteteko da.

Hauxe izan daiteke, C lengoaian idatzirik, hirugarren bertsioaren programa bat do-while egituraz kodeturik (while egitura erabil daiteke ere ariketa hau programatzeko):

/* 6a-Jarduera_PIzenbakiaWallis3 */
//------------------------------------------------------------------------------
//  PI kalkulatzeko, bi bikoteen arteko diferentzia txikia izan dadila:
//                        1         3         5         7          9
//    PI/2 = rPIerdi = 2/1*2/3 * 4/3*4/5 * 6/5*6/7 * 8/7*8/9 * 10/9*10/11 * ...
//    PI/2 = rPIerdi =   4/3   *  16/15  *  36/35  *  64/63  *  100/99    * ...
//    PI/2 = rPIerdi =  1.333  *  1.066  *  1.028  *  1.016  *   1.010    * ...
//------------------------------------------------------------------------------

#include <stdio.h>

int main() {
    double rPIerdi, rAurrekoBikotea, rOraingoBikotea, rEpsilon;
    int iKont;

    do {
        printf("Eman bi bikoteen arteko diferentziaren muga (adibidez: 0.000005): ");
        scanf("%lf", &rEpsilon);
        if (rEpsilon <= 0.00000010) {
            printf("Bi bikoteen arteko diferentzia 0.00000010 baino handiagoa izan dadila.\n");
        }
    } while (rEpsilon <= 0.00000010);

    printf("\n");

    iKont = 1;
    rOraingoBikotea = ((double)(iKont + 1) / iKont) * ((double)(iKont + 1) / (iKont + 2));
    rPIerdi = rOraingoBikotea;

    printf("iKont=%3d Orain=%12.8f PI=%10.8f rEpsilon=%15.7f\n", iKont, rOraingoBikotea, rPIerdi, rEpsilon);
    printf("-------------------------------------------------------------------------------\n");

    do {
        iKont += 2;
        rAurrekoBikotea = rOraingoBikotea;
        rOraingoBikotea = ((double)(iKont + 1) / iKont) * ((double)(iKont + 1) / (iKont + 2));
        rPIerdi *= rOraingoBikotea;

        printf("iKont=%3d Aurre=%9.8f Orain=%9.8f Dif.= %8.8f PI=%6.6f\n", iKont, rAurrekoBikotea, rOraingoBikotea, (rAurrekoBikotea - rOraingoBikotea), 2 * rPIerdi);
    } while ((rAurrekoBikotea - rOraingoBikotea) >= rEpsilon);

    printf("\n");
    printf("%10d iterazio ondoren:        iKont=%3d PI=%12.6f\n", (iKont / 2), iKont, 2 * rPIerdi);
    printf("\n");

    return 0;
}

Goiko programak ematen dituen bi irteera:

rEpsilon datuak 0.0001 balio du eta π konstantearen hamartarrak 3.099429 dira
rEpsilon datuak 0.0000005 balio du eta π konstantearen hamartarrak 3.133864 dira






  • 6a-Jarduera_PIzenbakiaWallis1.cbp | main.c
  • 6a-Jarduera_PIzenbakiaWallis2.cbp | main.c
  • 6a-Jarduera_PIzenbakiaWallis3.cbp | main.c


 

6. jarduera (I) | Pi zenbakia: Arkimedes (K.a. 250)







Arkimedes (Sirakusa, Sizilia, K.a. 287 - toki berean K.a. 212) matematikari, fisikari eta ingeniari greziarra zen. Antzinaroko zientzialari eta matematikari garrantzitsuenetarikotzat jotzen da.

Ziurrenik Arkimedesen ekarpen zientifiko ezagunena bere izena daraman hidrostatikako printzipioa den arren, Arkimedesen Printzipioa, beste arlo batzuetan lan egin zuen, adibidez zirkulu baten zirkunferentziaren eta bere diametroaren arteko erlazioa, gaur egun π (pi) hizkiarekin izendatzen dena.

Zirkunferentzia bati poligono erregularren inskripzio eta zirkunskripzio saioak egin ondoren, π konstantearen balioa finkatu zuen:

Arkimedesek zituen baliabide eskasak kontutan hartuta, lorpen handia izan zen 0,0040% baino errore txikiagoko kalkulua.




Arkimedesen metodoa hexagono erregularra erabiliz

R erradioa duen zirkunferentzia dugula, bi hexagono hartuko ditugu: bat bere barneko hexagono inskribatua eta bestea zirkunferentzia mugatzen duen hexagono zirkunskribatua. Hexagono biren perimetroen artean egongo da 2πR zirkuluaren zirkunferentzia.

Inskribatutako hexagonoa:

Inskribatutako hexagonoaren p perimetroa 6·R da triangelua ekilateroa delako (R=L) eta ondoko hau ikus daiteke, non ap apotema kalkulatzen den:

R = L
p = 6·R   (p, inskribatutako perimetroa)
R2 = R2/4 + ap2
ap2 = R2 - R2/4 = 3·R2/4
ap = √3·R/2   (apotema)


Zirkunskribatutako hexagonoa:

Zirkunskribatutako hexagonoaren P perimetroa kalkulatu behar da, horregatik hexagonoaren A aldea lortu behar da. Irudian ikusten den bezala OXY triangelua eta OX'Y' triangelua antzekoak dira:

R = OX = OY'
ap = OY
X'Y' / XY = OY' / OY       (bi triangeluak antzekoak dira)
(A/2) / (R/2) = R / ap       (apotema ap=R·√3/2)
(A/2) / (R/2) = R / (R·√3/2)  
A/R = 2/√3
A = R·2/√3
P = 6·A           (P, zirkunskribatutako perimetroa)
P = R·12/√3    (P, zirkunskribatutako perimetroa)




Beraz, inskribatutako hexagonoaren p perimetroa R·6 da, eta zirkunskribatutako hexagonoaren P perimetroa R·12/√3 da. Bestalde, R erradioko zirkunferentziari Pz deituz, badakigu bere balioa 2πR dela, non π inkognita den. Bi hexagonoen perimetroak berreskuratuz, argi dago  p < Pz < P  betetzen dela.

p < Pz < P
R·6 < 2πR < R·12/√3     (zati 2R egitean)
3.0 < π < 6/√3      
3.0 < π < 3.4641

Hexagonoa ez ezik, beste poligono batzuekin kalkuluak eginez, esate baterako 12, 24, 48 eta 96 alde dituzten poligonoekin lan eginez, Arkimedesek ondoko balio hau aurkitu zuen π zenbakiarentzat: 


Lehenago esan den bezala, emaitzak duen errorea 0,0040% baino txikiagoa da eta kontutan hartuta Arkimedesek zituen baliabideak, lorpen handia izan zela zalantzarik ez dago.
 

6. jarduera | Pi, nortasun handiko zenbakia







Martxoa da, urteko hirugarren hilabetea. Biharko asteartea, hamalaugarren eguna da. 3 eta 14, hots, π zenbakiaren hasiera. Horregatik, bihar π zenbakiaren nazioarteko eguna izango da.


berria egunkariko Pi, nortasun handiko zenbakia artikuluan π zenbakiari buruzko informazio gehiago eskaintzen digute. Jakes Goikoetxearen artikuluak jarraitzen duen gidoia:

  • Zein da pi zenbakia?
  • Zer da?
  • Zer eratako zenbakia da?
  • Pi zenbakiaren zenbat hamartar ezagutzen dira?
  • Nork aurkitu zuen pi zenbakia?
  • Zer arlotan erabiltzen da?
  • Zertarako?
  • Besterik?
  • Zer esan dute pi zenbakiari buruz?
  • Ba al du bitxikeriarik? Bai, esate baterako:
    • Pi zenbakiaren bitxikerietako bat haren hamartarrak ikasteko lehia da. Munduko sailkapen bat ere badago: Suresh Kumar Sharma indiarra da hamartar gehien ikasi dituena: 70.030, bigarrenak baino 30 gehiago
    • pilish idazkera, adibidez lehenetariko pilish esaldia James Jeans fisikoari zor diogu:
                          3    1    4   1    5            9      2       6        5     3
                      “How I need a drink, alcoholic in nature, after the
                       heavy lectures involving quantum mechanics!”

                          5           8           9               7               9
    • zure urtebetetzea pi zenbakian (mypiday edo DíaDePi)


π zenbaki irrazional bat izan arren, oraindik ere bada ahalik eta hamartar gehien bilatzen dituzte metematikariek. Hauek dira lehenengo berrogeita hamar hamartarrak:


π zenbakiaren hamartar horien bilaketan lagundu duten bost zientzialari aipa ditzagun: