Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.01.2013, 01:29
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Целая часть квадратного корня
Подскажите, как вытащить целую часть из-под квадратного корня?

Например, sqrt(12)=2*sqrt(3), sqrt(50)=5*sqrt(2).

Не нашёл реализации на javascript
Ответить с цитированием
  #2 (permalink)  
Старый 03.01.2013, 01:34
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Demath
Целая часть квадратного корня
http://javascript.ru/parseInt
Ответить с цитированием
  #3 (permalink)  
Старый 03.01.2013, 01:56
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от Deff Посмотреть сообщение
http://javascript.ru/parseInt
Не то.
Наверное, не достаточно чётко объяснил, что за целая часть.

Нужен алгоритм представления числа n в виде k^2*m.

Последний раз редактировалось Demath, 06.01.2013 в 19:06.
Ответить с цитированием
  #4 (permalink)  
Старый 03.01.2013, 02:27
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Demath
Наверное, не достаточно чётко объяснил, что за целая часть.
Вы имеете ввиду:
Максимальный целочисленный множитель
1.Составляем массив сомножителей подкоренного выражения и ищем среди них наибольший квадрат
Ответить с цитированием
  #5 (permalink)  
Старый 03.01.2013, 02:34
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от Deff
Вы имеете ввиду:
Целочисленный множитель
Да, именно его.

Сообщение от Deff
1.Составляем массив сомножителей подкоренного выражения и ищем среди них наибольший квадрат
Простите, а как получить сомножители?
Ответить с цитированием
  #6 (permalink)  
Старый 03.01.2013, 05:25
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

function Tstsqrt(Z) {
   var a = parseInt(Math.sqrt(Z));
   if(a<2) return false;
   for(var i=a; i>=2; i--){
      if(parseInt(Z/(i*i))==Z/(i*i)){
         return (''+i+'*sqrt('+Z/(i*i)+')');
      }
   } return false;
}

alert(Tstsqrt(12))
alert(Tstsqrt(50))
alert(Tstsqrt(1000))
alert(Tstsqrt(99998))
alert(Tstsqrt(1998))

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

Deff,
Сравним скорость?

// ------------------------------ Моё ------------------------------

var factorize = ( function ( 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;
  };

})( Math.pow( 2, 40 ) );

function normalizeSqrt ( number ) {

  var factors = factorize( number );

  if ( typeof factors == "number" && isNaN( factors ) ) {
    return "invalid number";
  }
  if ( factors === false ) {
    return "number too big";
  }

  var rational = 1;
  var irrational = 1;
  var factor;

  while ( factor = factors.pop() ) {

    rational *= Math.pow( factor.factor, factor.times >> 1 );

    if ( factor.times & 1 ) {
      irrational *= factor.factor;
    }
  }

  return rational + " * sqrt( " + irrational + " )";
}

// ------------------------------ Deff'а ------------------------------

function Tstsqrt(Z) {
   var a = Math.floor(Math.sqrt(Z));
   if(a<2) return false;
   for(var i=a; i>=2; i--){
      var j=Z/(i*i);
      if(Math.floor(j)==j){
         return (i+' * sqrt( '+j+' )');
      }
   } return false;
}

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

var numbers = [
  906972642240,
  1099505336329,
  1099505336330,
  1099505336331,
  1099505336332,
  1099505336333,
  Math.pow( 2, 40 ) - 1
];

function test ( title, func ) {

  var result = title + "\n\n";
  var timeStart = +new Date();

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

  result += "\nTime: " + ( ( +new Date() - timeStart ) / 1000 ).toFixed( 3 ) + " sec.";
  return result;
}

alert( test( "normalizeSqrt", normalizeSqrt ) + "\n\n\n\n" + test( "Tstsqrt", Tstsqrt ) );
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #8 (permalink)  
Старый 03.01.2013, 11:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Дзен-трансгуманист,
А время на формирование var factorize ???
Ответить с цитированием
  #9 (permalink)  
Старый 03.01.2013, 12:25
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Дзен-трансгуманист +(Плусы не ставяцо),
У мну разница на порядок, - (в принципе приемлимо, если задачка не частая...
Первое воплощение должно быть прозрачно для юзера (*Ксать снежок понравился

Скрин:

Ответить с цитированием
  #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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прижать часть строки влево, а часть вправо - как? GRIG (X)HTML/CSS 10 15.03.2012 16:12
$.ajax работает без success но при этом часть кода перезагружается!? saturn Элементы интерфейса 0 16.10.2011 10:09
Вырезать часть HTML-структуры slivka_83 Общие вопросы Javascript 3 27.10.2009 11:26