Показать сообщение отдельно
  #10 (permalink)  
Старый 03.01.2013, 12:40
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

рони,
Это одноразовая операция, создается список простых чисел с расчетом на многократное использование функции без перезагрузки страницы.
Но если так принципиально, измерения под катом:
function create ( maxNumber ) {

  var primesMapSize = Math.ceil( Math.sqrt( maxNumber ) );
  var primesMap = [ void 0, true ];
  var primesList = [];

  for ( var number = 2; number <= primesMapSize; number++ ) {

    if ( primesMap[ number ] === false ) {
      continue;
    }

    primesList.push( number );
    primesMap[ number ] = true;

    for ( var next = number * 2; next <= primesMapSize; next += number ) {
      primesMap[ next ] = false;
    }
  }

  maxNumber = primesMapSize * primesMapSize;

  return function ( number ) {

    if ( !isFinite( number = +number ) || number < 1 || number != Math.floor( number ) ) {
      return Number.NaN;
    }
    if ( number > maxNumber ) {
      return false;
    }
    if ( number == 1 ) {
      return [];
    }
    if ( number <= primesMapSize && primesMap[ number ] == true ) {
      return [ { factor : number, times : 1 } ];
    }

    var maxPrime = Math.floor( Math.sqrt( number ) );
    var prime;
    var primeId = 0;
    var factor;
    var factors = [];

    while ( ( prime = primesList[ primeId++ ] ) <= maxPrime ) {

      if ( number % prime == 0 ) {

        factors.push( factor = { factor : prime, times : 1 } );

        while ( ( number /= prime ) % prime == 0 ) {
          factor.times++;
        }

        if ( number == 1 ) {
          return factors;
        }

        maxPrime = Math.floor( Math.sqrt( number ) );
      }
    }

    factors.push( { factor : number, times : 1 } );
    return factors;
  };
}

// ------------------------------ Бенчмарк ------------------------------

var numbers = [
  Math.pow( 2, 20 ),
  Math.pow( 2, 30 ),
  Math.pow( 2, 40 )
];

function test ( maxNumber ) {

  var timeStart = +new Date();
  var factorize = create( maxNumber );

  return "maxNumber : " + maxNumber + ", time : " + ( ( +new Date() - timeStart ) / 1000 ).toFixed( 3 ) + " sec.";
}

for ( var i = 0, result = ""; i < numbers.length; i++ ) {
  result += test( numbers[ i ] ) + "\n";
}

alert( result );


Сообщение от Deff
У мну разница на порядок, - (в принципе приемлимо, если задачка не частая...
Ну это топик-стартер пускай сам решает, так как задача задаче - рознь. Может ему и тысячи хватит - тогда конечно не нужно ничего усложнять.)

Сообщение от Deff
Ксать снежок понравился
Спасибо.)
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 03.01.2013 в 12:50.
Ответить с цитированием