Advertisement
BlueMagma

Untitled

Jun 12th, 2017
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QList>
  4. #include <QtMath>
  5. #include <QElapsedTimer>
  6.  
  7. QList<quint64> primeList = {2,3,5,7,11};
  8. quint64 maxLevel = 1;
  9. quint64 update = 1000000;
  10.  
  11. quint64 nextPrime() {
  12.     quint64 lastPrime = primeList.last();
  13.     quint64 testNumber = lastPrime + 2;
  14.     quint64 limit = qCeil(qSqrt(testNumber));
  15.     quint64 index = 0;
  16.     while(true) {
  17.         if (testNumber % primeList.at(index) == 0) {
  18.             testNumber += 2;
  19.             limit = qCeil(qSqrt(testNumber));
  20.             index = 0;
  21.         } else if (index < primeList.count() && primeList.at(index) <= limit) {
  22.             index++;
  23.         } else {
  24.             primeList.append(testNumber);
  25.             return testNumber;
  26.         }
  27.     }
  28. }
  29.  
  30. QList<quint64> getDecomposition(quint64 number) {
  31.     QList<quint64> decomp;
  32.     quint64 index = 0;
  33.     quint64 limit = qCeil(qSqrt(number));
  34.     while(number > 1) {
  35.         quint64 prime;
  36.         if (index >= primeList.count()) {
  37.             prime = nextPrime();
  38.         } else {
  39.             prime = primeList[index];
  40.         }
  41.         if (primeList.contains(number) || prime > limit) {
  42.             decomp.append(number);
  43.             number = 1;
  44.         } else if (number % prime == 0) {
  45.             decomp.append(prime);
  46.             number /= prime;
  47.             limit = qCeil(qSqrt(number));
  48.         } else {
  49.             index++;
  50.         }
  51.     }
  52.     return decomp;
  53. }
  54.  
  55. QString recompose(QList<quint64> decomp, quint64 base = 10) {
  56.     QString result = "";
  57.     quint64 countRepeat = 1;
  58.     quint64 previous = -1;
  59.     for (quint64 i = 0; i < decomp.count(); i++) {
  60.         quint64 prime = decomp[i];
  61.         if (previous != prime) {
  62.             if (countRepeat > 1) {
  63.                 result += QString::number(countRepeat, base);
  64.             }
  65.             countRepeat = 1;
  66.             result += QString::number(prime, base);
  67.             previous = prime;
  68.         } else {
  69.             countRepeat++;
  70.         }
  71.     }
  72.     if (countRepeat > 1) {
  73.         result += QString::number(countRepeat, base);
  74.     }
  75.     return result;
  76. }
  77.  
  78. QString niceDecomp(QList<quint64> decomp, quint64 b) {
  79.     QString result = "";
  80.     quint64 countRepeat = 1;
  81.     quint64 previous = -1;
  82.     for (quint64 i = 0; i < decomp.count(); i++) {
  83.         quint64 prime = decomp[i];
  84.         if (previous != prime) {
  85.             if (countRepeat > 1) {
  86.                 result += "^" + QString::number(countRepeat, b);
  87.             }
  88.             countRepeat = 1;
  89.             if (!result.isEmpty()) {
  90.                 result += " x ";
  91.             }
  92.             result += QString::number(prime, b);
  93.             previous = prime;
  94.         } else {
  95.             countRepeat++;
  96.         }
  97.     }
  98.     if (countRepeat > 1) {
  99.         result += "^" + QString::number(countRepeat, b);
  100.     }
  101.     return result;
  102. }
  103.  
  104. bool check(quint64 i, QList<quint64> decomp, quint64 b, quint64 objective, quint64 level) {
  105.     quint64  parsed = recompose(decomp, b).toInt(Q_NULLPTR, b);
  106.     bool subresult = false;
  107.     if (i > parsed && level < maxLevel) {
  108.         QList<quint64> nextdecomp = getDecomposition(parsed);
  109.         subresult = check(parsed, nextdecomp, b, i, level + 1);
  110.     }
  111.     if (subresult || (decomp.count() > 1 && objective == parsed)) {
  112.         qDebug() << "* BASE:" << b << ":  \t"
  113.                  << qPrintable(QString::number(i, b)) << qPrintable("(" + QString::number(i) + ")") << qPrintable("=")
  114.                  << qPrintable(niceDecomp(decomp, b)) << qPrintable("(" + niceDecomp(decomp, 10) + ")");
  115.         return true;
  116.     }
  117.     return false;
  118. }
  119.  
  120. void find(quint64 start, quint64 max, quint64 minbase, quint64 maxBase) {
  121.     QElapsedTimer timer;
  122.     timer.start();
  123.     int previousElapsed;
  124.     for (quint64 i = start; i < max; i++) {
  125.         QList<quint64> decomp = getDecomposition(i);
  126.         if (i % update == 0) {
  127.             qDebug() << i << "took" << timer.elapsed() - previousElapsed << "\tprime count"
  128.                      << primeList.count() << "\tbiggest prime" << primeList.last() << "\telapsed" << timer.elapsed();
  129.             previousElapsed = timer.elapsed();
  130.         }
  131.         for (quint64 b = minbase; b <= maxBase; b++) {
  132.             check(i, decomp, b, i, 0);
  133.         }
  134.     }
  135.     qDebug() << "FINISH: from" << start << "to" << max << "in base" << minbase << "to" << maxBase << "took" << timer.elapsed() / 1000 << "seconds";
  136. }
  137.  
  138. int main(int argc, char *argv[])
  139. {
  140.     Q_UNUSED(argc)
  141.     Q_UNUSED(argv)
  142.     find(1, UINT64_MAX, 2, 36);
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement