2011-12-24 3 views
1

Предположим, у меня есть массив неповторяющихся десятичных чисел:Turn матрица десятичных чисел в матрицу целых чисел

v1 = 0.0588235294117647, 0.1428571428571429, 0.0526315789473684, 0.0769230769230769 

Я хотел бы, чтобы преобразовать это в массив целых чисел путем умножения/деления всех элементов по единому номеру:

v2 = 1729, 4199, 1547, 2261 

Все номера должны быть в наиболее простой форме, а также. Чтобы уточнить, это столбец решений матрицы с одной свободной переменной. Мне нужно сделать эту переменную равной, что делает весь столбец состоящим из целых чисел.

Я пробовал кучу вещей, но ничего не работает все время.

Мне нужен какой-то алгоритм, чтобы я мог автоматизировать этот процесс.

+2

Я не вижу взаимосвязи между этими значениями. Где ты достал их? Как вы дошли до этих целых чисел? – duffymo

+1

Непонятно, что вы хотите установить отношения между 'v1' и' v2'. –

+0

v1 и v2 - просто примеры, демонстрирующие, что я имел в виду под «не повторяющимся десятичным вектором» и «целым целым вектором» соответственно. Я просто сделал их для этого поста. Извини за это. –

ответ

2

Если я правильно вас понимаю, вы хотите сделать что-то, что приведет к очень большим целым числам.

Вы хотите найти целое число (желательно минимально возможное, но может быть не так быстро найдено), которое кратно 3.3837475943, назовите его m1. Затем сделайте то же самое, чтобы у вас были m1, m2, m3, m4. Затем вы хотите найти их самый низкий общий набор lcm(m1, m2, m3, m4) или просто используйте m1*m2*m3*m4, чтобы избежать вычисления lcm. И умножьте свой вектор v1 на результат. Это приведет к огромным целым числам в вашем векторе (который будет почти всегда не быть сохранен в 64 бит).

Так сказать, для указанных выше номеров вы можете легко выбрать:

m1 = 33837475943 
m2 = 89391713934747847847 
m3 = 23282781272732734 
m4 = 32838723 
m = m1*m2*m3*m4 //2312684250534946337531905217893260302519969924182717722 
v2 = m*v1 

Вы можете использовать быстрое преобразование Фурье, чтобы умножить свои м, так как они достаточно велики вы можете иметь O(n log(n)) умножение вместо , но Я не знаю, достаточно ли эти цифры, чтобы это действительно было полезно.

+0

В принципе, справа. Затем я хочу свести его к своей «простейшей» форме, что потребовало бы равномерного разделения на некоторое число. –

+0

@GeorgeCostanza Если вы выберете наименьшее количество кратных (вместо того, чтобы умножать на 10 единиц для каждого номера и используйте самый низкий общий кратный результата вместо 'm1 * m2 * m3 * m4', вы получите результат. В противном случае вы можете сделать это выше, а затем найти наибольший общий делитель чисел в вашем v2 и делить их на все. – Paulpro

+0

@GeorgeCostanza Я рекомендую этот второй способ на самом деле. Вы можете использовать этот 'gcd (a, b) = gcd (b, a mod b) 'с' a> b', чтобы найти gcd двух чисел довольно быстро. Вам нужно найти gcd из n (например, 4, как в вашем примере) больших чисел, а затем использовать gcd (v [1], gcd (v [2], gcd (v [3], v [4]))) ' – Paulpro

3

Основываясь на вашем комментарии к другому ответу, кажется, что ваш вопрос заключается в том, как масштабировать вектор так, чтобы все значения были целыми.

Это непростая задача, поскольку вам необходимо найти дробные аппроксимации для всех чисел в v1.

Похожие: Algorithm for finding the ratio of two floating-point numbers?

Есть в основном 2 основных подхода, чтобы сделать это в зависимости от того, какие цифры, которые вы хотите:

1) Простой способ: Вы не могли бы умножить вектор на 2, пока все становится интегральным. Это гарантировано, поскольку все текущие системы используют двоичную с плавающей запятой. Это по существу first answer в вышеуказанном вопросе.

Существует один главный недостаток этого подхода. Если ваши номера выглядят как:

0.3333333333333333 
0.1000000000000000 
0.2500000000000000 

вы получите очень «странные» (и потенциально большие) результаты.(Вы не получите: 20, 6, 15 который является искомым ответом)

2) Трудный путь: Этот подход заключается в использовании continued fractions на каждом элементе v1, чтобы превратить его в массив фракций. Затем умножьте каждый элемент на LCM всех знаменателей. Это по существу second answer в вышеуказанном вопросе.

Недостатком этого подхода является то, что его математика является интенсивной и сложной. Поэтому вам лучше просто копировать реализацию в этом ответе. Преимуществом является то, что он даст лучшие результаты.

+0

Спасибо. Это то, что я хотел. –

+0

Если это ответит на ваш вопрос, вы можете принять его, нажав на зеленая галочка. :) – Mysticial

Смежные вопросы