0

数値の因数を計算するコードがあります。これらの係数は、コントローラーの 2 つの次元 (m * N) をプログラムするために使用されます。コントローラーは N バイトごとに割り込みを生成するため、コントローラーの制限内で可能な最大の N を選択することが有益です。以下のコード フラグメントでは、この制限を MAX_DIM と呼んでいます。

以下に示すコードは機能的で、上記のように係数を計算します。私の質問は、現在最適な方法で処理していないコーナー ケースに関するものです。

可能性は低いですが、関数は素数で MAX_DIM より大きい入力値を処理する必要があります。この場合、エラーを返す必要があります。以下のコード フラグメントでは、因子 (m) の 1 つを任意に選択された値に達するまでチェックすることでこれを処理します。これは実際には機能しますが、このケースを検出するには、数学的および計算的により洗練された方法が必要であるとほぼ確信しています。この状況に適応できるアルゴリズムへのポインタを探しています。

m = tr_size/MAX_DIM;  // sets up a minimum value for m


if (m == 0)
{
    N = tr_size;
    m = 1;
    return 0;
} 
else
{
    /* TODO: check for m <= 128 ensures a mechanism to quit if 
     * tr_size is a prime number. Is there a better way to do this?
     */

    while ((((tr_size/m) > MAX_DIM) || (tr_size % m) != 0) && (m <=128))
    {
        m++;        
    }

    if (m > 128) 
    {
        return 1;  // error: cannot compute factors

    }

    N = tr_size/m;

    return 0;
}
4

1 に答える 1

1

因数をチェックするときは、因数分解される数値の平方根以下の値のみをチェックする必要があります。平方根よりも大きい係数は、対応する係数が平方根よりも小さくなります。

于 2012-10-02T23:31:24.660 に答える