Numere prietene

Acest forum este dedicat intrebarilor de programare care nu-si au locul in unul din celelalte forumuri

Re: Numere prietene

Mesajde Marius Bancila » 13 Feb 2009, 22:28

1740 secunde? Asta inseamna jumate de ora... OMG, Euler facea mai repede pe hartie. :biggrin:

Ia aici, ceva in C++
Cod: Selectaţi tot
#include <cmath>
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
   unsigned int start = 1000000;
   unsigned int number = start;
   int d = 0;
   int x = 0;
   int i = 0;
   unsigned int sum1 = 0;
   unsigned int sum2 = 0;

   LARGE_INTEGER lFreq, lStart, lEnd;
   QueryPerformanceFrequency(&lFreq);
   QueryPerformanceCounter(&lStart);

   while(number != 0)
   {
      d = 2;
      sum1 = 1;
      x = sqrt((float)number);
      while(sum1 += (!(number % d++) ? (d-1) + number / (d-1) : 0),  d <= x);

      if(sum1 > start)
      {
         d = 2;
         x = sqrt((float)sum1);
         sum2 = 1;
         while(sum2 += (!(sum1 % d++) ? (d-1) + sum1 / (d-1) : 0),  d <= x);

         if(sum2 == number && number != sum1)
         {
            QueryPerformanceCounter(&lEnd);

            if(sum2 == number && number != sum1)
               printf("%d, %d found in %lf seconds\n", number, sum1,
               (double(lEnd.QuadPart - lStart.QuadPart) / lFreq.QuadPart));
         }
      }

      number++;
   }

   return 0;
}


Rezultate pe un Intel Core2 6600 @ 2.40GHz:
Cod: Selectaţi tot
1077890, 1099390 found in 0.995056 seconds
1099390, 1077890 found in 1.281552 seconds
1154450, 1189150 found in 2.031244 seconds
1156870, 1292570 found in 2.064800 seconds
1175265, 1438983 found in 2.322432 seconds
1185376, 1286744 found in 2.464705 seconds
1189150, 1154450 found in 2.517882 seconds
1280565, 1340235 found in 3.845313 seconds
1286744, 1185376 found in 3.937708 seconds
1292570, 1156870 found in 4.024996 seconds
1328470, 1483850 found in 4.569408 seconds
1340235, 1280565 found in 4.752192 seconds
1358595, 1486845 found in 5.040557 seconds
1392368, 1464592 found in 5.577560 seconds
1438983, 1175265 found in 6.340507 seconds
1464592, 1392368 found in 6.773898 seconds
1466150, 1747930 found in 6.799562 seconds
1468324, 1749212 found in 6.835368 seconds
1483850, 1328470 found in 7.093063 seconds
1486845, 1358595 found in 7.142595 seconds
1511930, 1598470 found in 7.561186 seconds
1598470, 1511930 found in 9.036189 seconds
1669910, 2062570 found in 10.292292 seconds
1747930, 1466150 found in 11.703353 seconds
1749212, 1468324 found in 11.727245 seconds
1798875, 1870245 found in 12.646938 seconds
1870245, 1798875 found in 13.996658 seconds
2062570, 1669910 found in 17.835142 seconds
2082464, 2090656 found in 18.250374 seconds
2090656, 2082464 found in 18.422272 seconds
2236570, 2429030 found in 21.548343 seconds
2429030, 2236570 found in 25.865721 seconds
2652728, 2941672 found in 31.136261 seconds
2723792, 2874064 found in 32.879283 seconds
2728726, 3077354 found in 33.000414 seconds
2739704, 2928136 found in 33.273319 seconds
2802416, 2947216 found in 34.861520 seconds
2803580, 3716164 found in 34.890289 seconds
2874064, 2723792 found in 36.732089 seconds
2928136, 2739704 found in 38.158531 seconds
2941672, 2652728 found in 38.501841 seconds
2947216, 2802416 found in 38.643637 seconds
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 1775
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara

Re: Numere prietene

Mesajde Ovidiu Cucu » 14 Feb 2009, 11:48

Marius Bancila scrie:1740 secunde? Asta inseamna jumate de ora... OMG, Euler facea mai repede pe hartie. :biggrin:

La numere mari, Euler ar fi avut oaresce probleme cu FPU-ul. :biggrin:
OK. Clar metoda de calcul a sumei divizorilor e mult mai rapida.
L-am adaptat si eu pe get_sum_div.
Cod: Selectaţi tot
void get_sum_div(int min, int max, std::vector<std::pair<int,int>>& v)
{
    const int size = max - min;
    v.resize(size);
    int count = 0;

    for(int index = 0; index < size; index++)
    {
        int d = 2;
        int sum = 1;
        int n = min + index;
        int x = static_cast<int>(sqrt(static_cast<float>(n)));
        do
        {
            if(!(n % d))
            {
                sum += d + n / d;
            }
        }while(++d <= x);

        if(sum >= min)
        {
            v[count] = std::pair<int,int>(n, sum);
            count++;
        }
    }
    v.resize(count + 1);
}

Rezultatul
Cod: Selectaţi tot
get_sum_div() done in 5 s.
1077890 1099390 found in 25 s.
1154450 1189150 found in 44 s.
1156870 1292570 found in 45 s.
1175265 1438983 found in 49 s.
1185376 1286744 found in 52 s.
1280565 1340235 found in 72 s.
1328470 1483850 found in 80 s.
1358595 1486845 found in 84 s.
1392368 1464592 found in 88 s.
Press any key to continue . . .


Cinci secunde in loc de 1740... e o diferenta! :)
Mai lucram.
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2214
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Numere prietene

Mesajde Ovidiu Cucu » 14 Feb 2009, 11:58

Si ca sa trec in top... am gasit prima pereche mai mare de zece milioane. :D :biggrin:

Cod: Selectaţi tot
get_sum_div() done in 9 s.
10254970 10273670 found in 25 s.

Bineinteles, am ales un interval convenabil [10000000, 10300000]. ;)
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2214
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Numere prietene

Mesajde Marius Bancila » 14 Feb 2009, 12:21

Ovidiu Cucu scrie:Cinci secunde in loc de 1740... e o diferenta! :)
Mai lucram.

E, asa mi vi de-acasa. ;)
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 1775
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara

Re: Numere prietene

Mesajde Ovidiu Cucu » 14 Feb 2009, 12:55

Marius Bancila scrie:
Ovidiu Cucu scrie:Cinci secunde in loc de 1740... e o diferenta! :)
Mai lucram.

E, asa mi vi de-acasa. ;)

Cand i-am aratat lu fiimeu (din a cincea) prima metoda s-a prapadit de ras ("nica nu stiu mosnegii din ziua de azi") :biggrin:
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2214
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Numere prietene

Mesajde Viorel » 14 Feb 2009, 14:54

Am încercat şi eu o variantă pe care o prezint mai jos.


Cod: Selectaţi tot
   const int MIN = 10000000;
   const int MAX = MIN + 10000000;

   // -------------------

   using namespace std;

   assert(MIN > 2);
   assert(MIN <= MAX);

   time_t const start = time(000);

   const int lungime = MAX - MIN + 1;

   static int sume[lungime];

   for( int i = 0; i < lungime; ++i)
   {
      sume[i] = 1;
   }

   for( int n = 2; n < MAX / 2; ++n)
   {
      int m = MIN / n * n;
      if( m < MIN) m += n;
      assert(m >= MIN);

      int i = m - MIN;
      if( n >= MIN) i += n;

      for( ; i < lungime; i += n)
      {
         assert(MIN + i != n);
         assert(((MIN + i) % n) == 0);

         sume[i] += n;
      }
   }


   int total = 0;

   for( int i = 0; i < lungime - 1; ++i)
   {
      int const suma1 = sume[i];

      if( suma1 >= MIN && suma1 <= MAX)
      {
         int const j = suma1 - MIN;

         if( j > i)
         {
            int const numar1 = MIN + i;
            int const suma2 = sume[j];
            int const numar2 = MIN + j;

            if( suma1 == numar2 && suma2 == numar1)
            {
               ++total;
               cout << total << ") " << numar1 << " -- " << numar2 << endl;
            }
         }
      }
   }

   cout << "Timp calcul: " << (time(000) - start) << " sec." << endl;


Sper că e corectă.

Pentru intervalul 2 – 10.000.002 am obţinut 100 de numere prietene în aproximativ 4 secunde inclusiv timpul de afişaj. Procesor: Intel Core Duo 2 E8400 3 GHz.

Pentru intervalul 10.000.000– 20.000.000 am obţinut 33 de numere prietene tot în aproximativ 4 secunde.
Viorel
Microsoft MVP
Microsoft MVP
 
Mesaje: 147
Membru din: 13 Iul 2007, 12:26

Re: Numere prietene

Mesajde Ovidiu Cucu » 14 Feb 2009, 15:18

Super tare!!!
L-am rulat si eu, am obtinut cam aceeasi timpi si se pare ca-i OK.
Pentru verificare, ai aici o lista partiala de-a mea:
Cod: Selectaţi tot
    220     284
   1184    1210
   2620    2924
   5020    5564
   6232    6368
  10744   10856
  12285   14595
  17296   18416
  63020   76084
  66928   66992
  67095   71145
  69615   87633
  79750   88730
100485  124155
122265  139815
122368  123152
141664  153176
142310  168730
171856  176336
176272  180848
185368  203432
196724  202444
280540  365084
308620  389924
319550  430402
356408  399592
437456  455344
469028  486178
503056  514736
522405  525915
600392  669688
609928  686072
624184  691256
635624  712216
643336  652664
667964  783556
726104  796696
802725  863835
879712  901424
898216  980984
998104 1043096
1077890 1099390
1154450 1189150
1156870 1292570
1185376 1286744
1280565 1340235
1328470 1483850
1358595 1486845
1392368 1464592
1511930 1598470
1669910 2062570
1798875 1870245
2082464 2090656

La mine e posibil de lipseasca cate ceva pentru ca-i facuta "pe bucatzele". :)

Viorel, dau o naveta cu bere daca ne explici in cuvinte care-i algoritmul.
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2214
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Numere prietene

Mesajde Viorel » 14 Feb 2009, 17:07

Ovidiu Cucu scrie:[...]
Pentru verificare, ai aici o lista partiala de-a mea:
[...]
[...] ne explici in cuvinte care-i algoritmul.


Am verificat şi am obţinut aceeaşi listă.

Algoritmul este următorul. Se creează vectorul sume care va conţine sumele divizorilor unui interval de numere. Se iniţializează cu 1 deoarece acesta este divizorul oricărui număr. Apoi se parcurge vectorul cu pasul 2 şi se adaugă 2 la fiecare element, pentru că fiecare al doilea număr se împarte la 2 fără rest. Urmează parcurgerea şi adăugarea cu pasul 3, deoarece fiecare al treilea număr se împarte la 3 fără rest. Procedeul se repetă pentru ceilalți paşi pînă la ultimul pas, care nu poate depăşi o jumătate din numărul maxim.

Deoarece vectorul corespunde unui interval de numere care nu începe cu 1, înainte de parcurgere se determină primul element de parcurs. Totodată în sumă nu se includ divizorii egali cu numerele propriu-zise.

După aflarea sumelor se caută perechile potrivite luînd în considerare relaţia între poziţie şi număr.

Dacă tipul de date pentru sume se înlocuieşte cu long long, atunci programul dă următoarea pereche unică de numere prietene din intervalul 1.000.000.000-1.010.000.000:

1002455350 1005541130

Dar deja durează 8 secunde.
Viorel
Microsoft MVP
Microsoft MVP
 
Mesaje: 147
Membru din: 13 Iul 2007, 12:26

Re: Numere prietene

Mesajde Ovidiu Cucu » 16 Feb 2009, 12:34

De curiozitate, am facut un programel de verificare
Cod: Selectaţi tot
#include <iostream>

void print_sum_div(unsigned int n)
{
    unsigned int sum = 1;
    std::cout << "Suma divizorilor lui " << n << " :" << std::endl;
    std::cout << "   1 " << std::endl;
    unsigned int divmax = n / 2;
    for(unsigned int i = 2; i <= divmax; i++)
    {
        if(!(n % i))
        {
            sum += i;
            std::cout << " + " << i << std::endl;
        }
    }
    std::cout << "= " << sum << std::endl << std::endl;
}

int main()
{
    print_sum_div(1002455350);
    print_sum_div(1005541130);
    return 0;
}

Rezultatul
Cod: Selectaţi tot
Suma divizorilor lui 1002455350 :
  1
+ 2
+ 5
+ 10
+ 13
+ 25
+ 26
+ 50
+ 65
+ 130
+ 325
+ 650
+ 1542239
+ 3084478
+ 7711195
+ 15422390
+ 20049107
+ 38555975
+ 40098214
+ 77111950
+ 100245535
+ 200491070
+ 501227675
= 1005541130

Suma divizorilor lui 1005541130 :
  1
+ 2
+ 5
+ 10
+ 11
+ 22
+ 55
+ 59
+ 110
+ 118
+ 295
+ 590
+ 649
+ 1298
+ 3245
+ 6490
+ 154937
+ 309874
+ 774685
+ 1549370
+ 1704307
+ 3408614
+ 8521535
+ 9141283
+ 17043070
+ 18282566
+ 45706415
+ 91412830
+ 100554113
+ 201108226
+ 502770565
= 1002455350

Deci, Viorel, se pare ca in acest moment detii recordul mondial la "numere prietene". :)

// nu uit de berea promisa. ;)
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2214
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Numere prietene

Mesajde Marius Bancila » 16 Feb 2009, 16:22

Bravo domne'. Ai inaltat stacheta. ;) Dar nu ne dam batuti inca... :?
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 1775
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara

Re: Numere prietene

Mesajde crystyce » 16 Feb 2009, 19:42

Nenea Euler s-a chinuit el un pic si a optimizat putin regula lu' unu cu nume greu si a iesit asta: http://mathworld.wolfram.com/EulersRule.html
Saracu a gasit el formula dar mai mult de 3 perechi nu cred ca a calculat...

Am pus si codul in VS2005 pentru ca am folosit o librarie pentru numere mari: http://ttmath.slimaczek.pl/ttmath

220 284
Gasita in: 0.002197 secunde

2172649216 2181168896
Gasita in: 0.013832 secunde

17296 18416
Gasita in: 0.126776 secunde

9363584 9437056
Gasita in: 0.272318 secunde

2724918040393706557785752240819405848576 2724918040396184856306258038787235905536
Gasita in: 2.410465 secunde

Mai mult de atat nu am gasit poate daca ma joc un pic cu valorile lui m si n dar...it feels like cheating

Cod: Selectaţi tot
#include "stdafx.h"

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

#include "ttmath/ttmath.h"

typedef ttmath::Int<20> BigInt;

#define STARTM 1   // m incepe de aici
#define STOPM 100   // si se opreste aici
#define STOPN 30   // n incepe de la m+1 si se opreste la m+1+STOPN

BigInt pow2(BigInt exp)
{
   BigInt res = 1;
   
   for (BigInt i = 0 ; i < exp ; i++)
      res *= 2;

   return res;
}

BigInt ExpMod(BigInt value, BigInt exp, BigInt mod)
{
   BigInt ullResult = 1;
   BigInt ullValue = value;

   while(exp > 0)
   {
      if(exp % 2 != 0)
      { // odd
         ullResult *= ullValue;
         ullResult %= mod;
      }

      ullValue *= ullValue;
      ullValue %= mod;
      exp /= 2;
   }

   return(ullResult);
}

BOOL isMillerRabinPrime(BigInt prime)
{
   // randomWitness = witness that the "prime" is NOT composite
   // 1 < randomWitness < prime-1
   DWORD totalWitness = 15;
   BigInt randomWitness[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 51001, 351011};
   BigInt primeMinusOne = prime - 1;
   BigInt oddMultiplier;
   DWORD bitLength;
   DWORD i, j;
   BigInt result;
   // find oddMultiplier, defined as "prime - 1 = (2^B) * M"
   // get bitLength (B) and find the oddMultiplier (M)

   // init value multiplier
   oddMultiplier = primeMinusOne;

   bitLength = 0; // reset
   while(oddMultiplier % 2 == 0)
   {
      oddMultiplier /= 2;
      bitLength++;
   }
   for(i = 0; i < totalWitness; i++)
   {
      if (randomWitness[i] == prime)
         return TRUE;

      // init value of result = (randomWitness ^ oddMultiplier) mod prime
      result = ExpMod(randomWitness[i], oddMultiplier, prime);

      // is y = 1 ?
      if(result == 1)
         continue; // maybe prime

      // is y = prime-1 ?
      if(result == primeMinusOne)
         continue; // maybe prime

      // loop to get AT LEAST one "result = primeMinusOne"
      for(j = 1; j <= bitLength; j++)
      {
         // square of result
         result = ExpMod(result, 2, prime);

         // is result = primeMinusOne ?
         if(result == primeMinusOne)
            break; // maybe prime
      }

      if(result != primeMinusOne)
         return(FALSE); // COMPOSITE
   }

   // it may be pseudoprime/prime
   return(TRUE);
}

int main()
{
   LARGE_INTEGER lFreq, lStart, lEnd;
   QueryPerformanceFrequency(&lFreq);
   QueryPerformanceCounter(&lStart);

   for (BigInt m = STARTM ; m <= STOPM ; m++)
   {
      for (BigInt n = m+1 ; n <= m+STOPN ; n++)
      {
         //unsigned int p = (1<<n) + (1<<m) - 1;
         BigInt p = pow2(n) + pow2(m) - 1;
         if (!isMillerRabinPrime(p)) continue;
         
         //unsigned int q = (1<<(2*n-m)) + (1<<n) -1;
         BigInt q = pow2(n+n-m) + pow2(n) -1;
         if (!isMillerRabinPrime(q)) continue;

         //unsigned int r = (1<<(3*n-m)) + (1<<(n+m)) + (1<<(2*n+1)) -1;
         BigInt r = pow2(n+n+n-m) + pow2(n+m) + pow2(n+n+1) -1;
         if (!isMillerRabinPrime(r)) continue;

         BigInt f1 = pow2(n) * p * q;
         BigInt f2 = pow2(n) * r;
         
         //std::cout << m << " " << n << " " << p << " " << q << " " << r << " " << f1 << " " << f2 << std::endl;
         std::cout << f1 << " " << f2 << std::endl;

         QueryPerformanceCounter(&lEnd);
         printf("Gasita in: %lf secunde\n\n", (double(lEnd.QuadPart - lStart.QuadPart) / lFreq.QuadPart));
      }
   }

   QueryPerformanceCounter(&lEnd);
   printf("\nTimp total %lf secunde\n", (double(lEnd.QuadPart - lStart.QuadPart) / lFreq.QuadPart));

   scanf("\n");

   return 0;
}
Fişiere ataşate
amin.zip
(87.13 KiB) Descărcat de 11 ori
Avatar utilizator
crystyce
Junior
Junior
 
Mesaje: 38
Membru din: 26 Iul 2007, 22:24
Localitate: Bucuresti

Re: Numere prietene

Mesajde Marius Bancila » 16 Feb 2009, 22:30

crystyce scrie:2724918040393706557785752240819405848576 2724918040396184856306258038787235905536
Gasita in: 2.410465 secunde

La cat sunt de mari, nu cred ca stiu sa citesc numere astea... ;) :thumbup:

BTW, ar trebui precizat ca formula lui Euler nu gaseste toate perechile. Dar asta nu conteaza pentru concursul asta, pt. ca pe noi ne intereseaza cel mai mare pereche si nu toate perechile.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 1775
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara

Re: Numere prietene

Mesajde Andreas » 17 Feb 2009, 14:35

Marius wrote:
BTW, ar trebui precizat ca formula lui Euler nu gaseste toate perechile. Dar asta nu conteaza pentru concursul asta, pt. ca pe noi ne intereseaza cel mai mare pereche si nu toate perechile.


Da dar dovedit: daca incercam sa aflam brut suma divizorilor lui 2724918040393706557785752240819405848576 apropae orice comp moare; spre exemplificare am modificat programelul lui Ovidiu pentru BigInt(incluzand libraria tmath):
Cod: Selectaţi tot
#include <iostream>
#include "ttmath/ttmath.h"
#include "conio.h"

typedef ttmath::Int<20> BigInt;

BigInt pow2(BigInt exp)
{
   BigInt res = 1;
   
   for (BigInt i = 0 ; i < exp ; i++)
      res *= 2;

   return res;
}

void print_sum_div(BigInt n)
{
    BigInt sum = 1;
    std::cout << "Suma divizorilor lui " << n << " :" << std::endl;
    std::cout << "   1 " << std::endl;
    BigInt divmax = n / 2;
    BigInt i=2;//pow2(40); //<-- pentru a sarii peste divizorii puteri ale lui 2
    for(; i <= divmax; i*=2)//i++) //<-- a doua iteratie este pentru comentariu de mai sus
    {      
        if(n % i == 0)
        {
            sum += i;
            std::cout <<"+ " << i << std::endl;         
        }            
    }   
    std::cout <<i<< "= " << sum <<" "<<divmax<<std::endl << std::endl;
}

int main()
{
   BigInt n=40;   
   BigInt m=29;   

   BigInt p = pow2(n) + pow2(m) - 1;
   BigInt q = pow2(n+n-m) + pow2(n) -1;
   BigInt r = pow2(n+n+n-m) + pow2(n+m) + pow2(n+n+1) -1;         

   BigInt f1 = pow2(n) * p * q;
   BigInt f2 = pow2(n) * r;

    print_sum_div(f1);
    print_sum_div(f2);
   getch();
    return 0;
}


dupa o rulare normala se observa ca primii divizorii sunt puteri ale lui 2; initial am crezut ca asta este regula pentru aflarea divizorilor, dar nu e asa, mai sunt si altii; iar aflarea lor ia o vesnicie...interesant ca suma divizorilor puteri ale lui 2 este aceiasi, 2199023255551, pentru ambele numere. Cred ca ar fi o provocare si numai sa calculezi suma divizorilor pentru un numar asa de mare.

Cred ca aceasta problema (perechi de numere amicale f mari)se rezolva prin teoreme(reguli) matematice, ca in cazul lui crystyce, nu prin forta bruta.
Iar cand aplici teoremele si gasesti o pereche nu le poti verifica pe un comp normal, intr-un timp rezonabil.

Deci, sa nu ne grabim cu premiile... :biggrin:

Ce s-a scris/demonstrat in acest thread, are fiecare frumusetea lui:
Marius: cel mai rapid algoritm de calcul al sumei divizorilor
Viorel: cel mai rapid algoritm intr-un interval
crystyce: aflarea dupa reguli si "big numbers"

Desi cred ca stiti, am sa pun aici referinta la ce s-a descoperit pana acum: Known Amicable Pairs
Avatar utilizator
Andreas
Membru
Membru
 
Mesaje: 98
Membru din: 09 Noi 2008, 12:13
Localitate: Timisoara

Re: Numere prietene

Mesajde Ovidiu Cucu » 17 Feb 2009, 18:12

Andreas scrie:Desi cred ca stiti, am sa pun aici referinta la ce s-a descoperit pana acum: Known Amicable Pairs

Cred ca n-ar fi rau sa publicam si noi un "Ultimate list..." :).
Ovidiu Cucu
Microsoft MVP - Visual C++
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 2214
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi

Re: Numere prietene

Mesajde crystyce » 17 Feb 2009, 18:29

Am gasit in lista aia numarul meu, il cheama TeRiele dupa cel care l-a gasit si e aproape de doua ori mai batran ca mine...

21 TeRiele 1972
2724918040393706557785752240819405848576=2^40*1100048498687*2252899325313023
2724918040396184856306258038787235905536=2^40*2478298520505800166853312511

Cred ca n-ar fi rau sa publicam si noi un "Ultimate list..." .


In lista aia cea mai mare pereche are 36232 de cifre la cel mai mic numar :wacko: .

Ovidiu facem lista, dar facem si cheta sa luam storage ca daca gasim macar cat aia ne trebuie vreo 40-50 de giga...
Avatar utilizator
crystyce
Junior
Junior
 
Mesaje: 38
Membru din: 26 Iul 2007, 22:24
Localitate: Bucuresti

AnteriorUrmătorul

Înapoi la Programare generala

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator