我在一篇关于遗传编程的论文中引用了“受保护的除法”操作。当我用谷歌搜索这个时,我得到的大部分是关于遗传编程的论文以及与密码学相关的各种结果,但没有一个能够解释它实际上是什么。有谁知道吗
受保护的除法(通常用%表示)检查它的第二个除法是否 参数为 0。如果是这样,% 通常返回值 1(无论 第一个参数的值)。
http://en.wikipedia.org/wiki/Genetic_programming
在密码学中,它似乎没有明确定义,但谷歌的热门搜索是为了防止侧信道攻击(在这种情况下,通过电力使用 - 您可以通过查看除法中使用的数字来猜测)进行加密的硬件功耗) http://dl.acm.org/itation.cfm?id=1250996 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.9 .7298&rep=rep1&type=pdf
在 GP 中,受保护除法是一种改进的除法运算符,当分母为 0(零)时,它不会发出“除零”错误信号。当分母为零时,它通常返回 1。
它根据参数的阈值函数而不是参数进行划分。
Thres(x) = epsilon*Theta(x) if fabs(x)<epsilon.
其中 Theta() 是 theta 函数的非零变体。
其他可能的阈值函数。或者有时它只是“epsilon”。
当使用遗传编程(GP)进化程序时,每个生成的程序都会经过测试以获得其适应度值。 当演化的程序是数学表达式时,需要受保护的除法。在密码学中,数学表达式可用于对决策过程进行建模。 在评估步骤中,程序可能会执行除以零的操作,这会导致崩溃。为了避免这种情况,受保护的除法被设置为在分母等于零时返回特定值。我看到了三种设置:
该设置应在论文中的某处指定。 如果不是,最安全的选择是假设受保护的除法返回分子。 鉴于 1 是乘法中性,0 是加法中性,它们可能会在进化过程中生成的程序中造成一些偏差,但仍然常用。
上面的答案很好,但我的建议是避免受保护的除法,因为结果是不可预测的。
相反,如果您除以零(或任何其他异常),请将该运算符修改(变异)为另一个不会生成异常的运算符。
我确实将这个策略实施到了多表达式编程中。
这是与此案例相关的代码摘录
void compute_eval_matrix(const t_mep_chromosome &c, int code_length, int num_variables,
int num_training_data, const double **training_data,
double **eval_matrix)
{
for (int i = 0; i < code_length; i++){ // read the chromosome from top to down
bool is_error_case = false;// division by zero, other errors
switch (c.code[i].op) {
case DIV_OP: // handle division
for (int k = 0; k < num_training_data; k++)
if (fabs(eval_matrix[c.code[i].addr2][k]) < 1e-6) // test if it is too small
is_error_case = true;
if (is_error_case) { // an division by zero error occured !!!
c.code[i].op = rand() % num_variables; // the gene is mutated into a terminal
for (int k = 0; k < num_training_data; k++)
eval_matrix[i][k] = training_data[k][c.code[i].op];
}
else // normal execution....
for (int k = 0; k < num_training_data; k++)
eval_matrix[i][k] = eval_matrix[c.code[i].addr1][k] / eval_matrix[c.code[i].addr2][k];
break;
default: // a variable
break;
} // end switch
} // end for
}