| 609 | } |
| 610 | |
| 611 | string VanitySearch::GetExpectedTime(double keyRate,double keyCount) { |
| 612 | |
| 613 | char tmp[128]; |
| 614 | string ret; |
| 615 | |
| 616 | if(hasPattern) |
| 617 | return ""; |
| 618 | |
| 619 | double P = 1.0/ _difficulty; |
| 620 | // pow(1-P,keyCount) is the probality of failure after keyCount tries |
| 621 | double cP = 1.0 - pow(1-P,keyCount); |
| 622 | |
| 623 | sprintf(tmp,"[Prob %.1f%%]",cP*100.0); |
| 624 | ret = string(tmp); |
| 625 | |
| 626 | double desiredP = 0.5; |
| 627 | while(desiredP<cP) |
| 628 | desiredP += 0.1; |
| 629 | if(desiredP>=0.99) desiredP = 0.99; |
| 630 | double k = log(1.0-desiredP)/log(1.0-P); |
| 631 | if (isinf(k)) { |
| 632 | // Try taylor |
| 633 | k = log(1.0 - desiredP)/log1(P); |
| 634 | } |
| 635 | double dTime = (k-keyCount)/keyRate; // Time to perform k tries |
| 636 | |
| 637 | if(dTime<0) dTime = 0; |
| 638 | |
| 639 | double nbDay = dTime / 86400.0; |
| 640 | if (nbDay >= 1) { |
| 641 | |
| 642 | double nbYear = nbDay/365.0; |
| 643 | if (nbYear > 1) { |
| 644 | if(nbYear<5) |
| 645 | sprintf(tmp, "[%.f%% in %.1fy]", desiredP*100.0, nbYear); |
| 646 | else |
| 647 | sprintf(tmp, "[%.f%% in %gy]", desiredP*100.0, nbYear); |
| 648 | } else { |
| 649 | sprintf(tmp, "[%.f%% in %.1fd]", desiredP*100.0, nbDay); |
| 650 | } |
| 651 | |
| 652 | } else { |
| 653 | |
| 654 | int iTime = (int)dTime; |
| 655 | int nbHour = (int)((iTime % 86400) / 3600); |
| 656 | int nbMin = (int)(((iTime % 86400) % 3600) / 60); |
| 657 | int nbSec = (int)(iTime % 60); |
| 658 | |
| 659 | sprintf(tmp, "[%.f%% in %02d:%02d:%02d]", desiredP*100.0, nbHour, nbMin, nbSec); |
| 660 | |
| 661 | } |
| 662 | |
| 663 | return ret + string(tmp); |
| 664 | |
| 665 | } |
| 666 | |
| 667 | // ---------------------------------------------------------------------------- |
| 668 | |