2011-12-24 14 views
1

私は非循環小数数字の配列があるとします。ターン行列

v1 = 0.0588235294117647, 0.1428571428571429, 0.0526315789473684, 0.0769230769230769 

私はすべての要素を分割/乗じて整数の配列にこれを変換したいです単一数で:

v2 = 1729, 4199, 1547, 2261 

すべての数字は、同様に彼らの最も単純な形式でする必要があります。これを明確にするために、これは1つの自由変数を持つ行列の解列です。私はその変数を、列全体を整数全体で構成するものに等しくする必要があります。

私はたくさんのことを試みましたが、何も常に動作するとは思われません。

私はこのプロセスを自動化するために、ある種のアルゴリズムが必要です。

+2

これらの値の間には関係がありません。どこで手に入れましたか?どのようにそれらの整数に到達しましたか? – duffymo

+1

'v1'と' v2'の関係をあなたが望むものは不明です。 –

+0

v1とv2は、それぞれ「非繰り返し10進ベクトル」と「整数ベクトル」の意味を実証するための単なる例です。私はちょうどこのポストのためにそれらを作った。申し訳ありません。 –

答えて

2

私が正しく理解していれば、非常に大きな整数が得られるようなことをしたいのです。

3.3837475943の倍数の整数(可能な限り小さいが、見つけるのが速くない可能性があります)を探したい場合は、m1とします。それでm1、m2、m3、m4と同じようにします。次に、最も低い共通の倍数lcm(m1, m2, m3, m4)を見つけたり、lcmの計算を避けるためにm1*m2*m3*m4を使用したいとします。その結果、ベクトルv1を乗算します。これはあなたのベクトルに膨大な整数をもたらします(ほとんど常にではなく、は64ビットで格納可能です)。

だから、簡単に選ぶことができ、あなたの上の数字のために言う:

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

をあなたは彼らが非常に大きいので、あなたの代わりにO(n log(n))乗算を持つことができ、あなたのMさんを掛けるために高速フーリエ変換を使用することもできますが、私はこれらの数字が実際に有益であるのに十分な大きさかどうかはわかりません。

+0

基本的には、右。それから私はそれをいくつかの番号で一様に分割する必要がある "最も単純な"形式に縮小したいと思います。 –

+0

@GeorgeCostanza各番号に10の累乗を乗算するのではなく、最小の倍数を選択し、 'm1 * m2 * m3 * m4'の代わりに結果の最小公倍数を使用すると、結果が得られます。 そうでなければ、上記のやり方であなたのv2の数字の最大公約数を見つけ出し、それをすべてで割ります。 – Paulpro

+0

@GeorgeCostanzaこの2番目の方法を実際にお勧めします。この 'gcd(a、b) = gcd(b、a mod b) 'a> b'を使って2つの数字のgcdをかなり速く見つけてください。nのgcd(あなたの例のように4つ)を見つけ、gcd – Paulpro

3

他の答えに対するあなたのコメントに基づいて、あなたの質問は、すべての値が整数であるようにベクトルをスケールアップする方法であるように思えます。

v1のすべての数値の小数点近似を求める必要があるので、これは簡単な作業ではありません。

関連:Algorithm for finding the ratio of two floating-point numbers?

したい数値の種類に応じて、これを行うための2つの主要なアプローチ基本的にあります。

1)は、簡単な方法:あなたはすべてのものになるまで2でベクトルを掛けることができが、積分される。現在のすべてのシステムでは2進浮動小数点が使用されているため、これは保証されています。これは基本的に上記の質問のfirst answerです。

このアプローチには大きな欠点が1つあります。あなたの数字が次のような場合:

0.3333333333333333 
0.1000000000000000 
0.2500000000000000 

あなたは非常に奇妙な(そして潜在的に大きな)結果を得るでしょう。(あなたが得ることはありません。希望の答えです20, 6, 15

2)難しい方法:は、このアプローチは、画分の配列にそれを回すためにv1の各要素に対してcontinued fractionsを使用することです。次に、すべての要素をすべての分母のLCMで掛けます。これは本質的に上記の質問のsecond answerです。

このアプローチの欠点は、数学的に集中的で複雑なことです。だからあなたは、その答えの実装をコピーするほうがよかったです。利点は、より良い結果が得られることです。

+0

緑のチェックマーク。:) –

+0

これがあなたの質問に答えるならば、あなたはそれを受け入れることができます。[1]、gcd(v [2]、gcd(v [3]、v [4]))) – Mysticial

関連する問題