找到给定数字的“中等大”除数?

找到给定数字的“中等大”除数?

处理一些数据后,我得到一个文件,其中包含一定数量的数据点——每行一个。我需要将这些数据点传递给另一个工具,该工具将进行更多的数字运算——在该工具中,我需要为给定的运行设置“批量大小”:

./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——这种情况几乎肯定不会发生,所以我不担心它),那也没什么大不了的。

有没有一种巧妙的方法可以使用 shell 工具来做到这一点?我知道我可以得到Mwith的因数factor。在Python中我可能会写这样的东西:

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

现在我得到的分数M比 1/10 小一点,具体取决于M有多少因素。

我不确定如何将其作为 shell 脚本来完成,或者我可以使用什么工具来使其更容易。这件事能做得很好吗?我是否最好将因素列表传递给一个小型 Python 脚本并在那里执行逻辑?

答案1

这是使用 GNU 的 python 算法的 shell 版本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")

相关内容