与えられた数の「通常大きい」除数を探しますか?

与えられた数の「通常大きい」除数を探しますか?

一部のデータを処理した後、特定の数のデータポイント(1行に1つ)を含むファイルを取得します。これらのデータポイントをより多くの数値処理を実行する他のツールに渡す必要があります。そのツールで特定の実行に対して「配置サイズ」を設定する必要があります。

./gen_data.sh > data.txt
./process_data.sh < data.txt > parsed.bin
./crunch_data.sh --total=$(wc -l < data.txt) --batch_size=N --infile=parsed.bin

バッチサイズがN小さすぎると処理に時間がかかり、バッチサイズが大きすぎると出力品質が低下します。バッチサイズはで与えられたデータポイントの数で割る必要がありますM=$(wc -l < data.txt)N周囲の価値はM/10かなり良いようです。バッチサイズが奇妙な状況で奇妙なことをする場合(例えば、少数のN=M場合はMほとんど確実に発生しないので心配しない)、特に問題はありません。

シェルツールを使用してこれを行うためのきちんとした方法はありますか?私はMの引数を得ることができることを知っていますfactor。 Pythonでは、次のように書くことができます。

total_portion = 1
for factor in factors(M):
    total_portion *= factor
    if total_portion > 10:
        return M/total_portion

今私が得たスコアは、要素の数に応じてM1/10よりわずかに小さいです。M

シェルスクリプトを使ってこれを行う方法、またはそれをより簡単にするためにどのツールを使用できるのかわかりません。これはうまくいけますか?要素のリストを小さなPythonスクリプトに渡し、そこでロジックを実行する方が良いですか?

答え1

以下は、GNUを使用したPythonアルゴリズムのシェルバージョンですfactor

#! /bin/bash

function total_portion() {
    local M="$1"
    local total_portion=1

    for factor in $(factor "$M" | sed -e 's/^[0-9]\+: //'); do
        ((total_portion *= factor))
        if [ "$total_portion" -gt 10 ] ; then
            echo $((M / total_portion))
            return 
        fi
    done
}

M=$(wc -l < data.txt)

tp=$(total_portion "$M")

関連情報