PHP 根据答案生成数学方程式

PHP Generate Math equation from answer

我需要一些用 PHP 编写的函数,以使用答案生成一个简单的数学方程式。例如:
输入:

6688650

输出:(或类似的东西)

75 * 34 * (1 * (43 * 61)) 

输入:

249366

输出:(或类似的东西)

(((99 + 87) + 95 * 99) * 26)

我想出了这个质因数生成器,但我需要一种方法将这些因数转换为方程式,例如 (((99 + 87) + 95 * 99) * 26)

function primefactor($num) {
    $sqrt = sqrt($num);
    for ($i = 2; $i <= $sqrt; $i++) {
        if ($num % $i == 0) {
            return array_merge(primefactor($num/$i), array($i));
        }
    }
    return array($num);
}

还有一个数字生成器:

do {
    $num = mt_rand(6542,89523498);

} while (is_prime($num) & count(primefactor($num)) > 5);

这给我留下了类似的东西:

Original: 78973465
Array ( [0] => 349 [1] => 271 [2] => 167 [3] => 5 )

概念

  1. 将整数转换为素数数组。

  2. 您可以组合素因子,但您可以选择生成方程。但是,这不是 1:1 函数(除非数字是质数)。因此,您可以创造性地考虑如何将这些数字重新组合在一起。

在这个实现中,我决定随机生成素数的加法和组合以形成互素数。

备注

创建一种有效的质因数分解方法变得有点复杂。我在这里写了一个非常简单的,很可能它会满足您的需要。但是,如果您需要一种更快的方法(或者如果您要处理更大或更多的数字),您可能需要进行一些独立研究。我在谷歌上搜索了一下,this suggestion 出现了。

代码

<?php

$n = 6688650;

//generates a list of all factors
function primefactor($num) {
    $sqrt = sqrt($num);
    for ($i = 2; $i <= $sqrt; $i++) {
        if ($num % $i == 0) {
            return array_merge(primefactor($num/$i), array($i));
        }
    }
    return array($num);
}

//generates multiplication equation
//  Let's scramble those numbers

$factors = primefactor($n);

//let's randomly combine some of our prime factors
for ($i = 0, $len = count($factors); $i < $len; $i++) {
  if (mt_rand(0,1)) {
    $keys = array_rand($factors,2);
    $to = $factors[$keys[0]]*$factors[$keys[1]];
    array_push($factors, $to);
    unset($factors[$keys[0]]);
    unset($factors[$keys[1]]);
  }
}

//now, let's insert some random addition
foreach ($factors as $key => $value) {
  if (mt_rand(0,1)) {
    $delta = mt_rand(1,$factors[$key]-1);
    $factors[$key] = '(' . ($value-$delta) . '+' . $delta . ')';
  }
}

//output the information
$myValues = array_values($factors);
shuffle($myValues);
echo join('*',$myValues);

?>

一些输出

5185*(145+1145)
3*(59+27)*(23+62)*(269+36)
1462*(26+35)*5*5*(2+1)