рони,
Это одноразовая операция, создается список простых чисел с расчетом на многократное использование функции без перезагрузки страницы.
Но если так принципиально, измерения под катом:
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
|
Ксать снежок понравился
|
Спасибо.)