factores_primos-v2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<?PHP
/*
[Prohibido borrar o modificar las lineas siguientes]
INFORMACIÓN DEL SCRIPT
======================
Nombre: Funciones con Números Primos
Versión: 2.0beta
Última Revisión: 15/03/2005
Bitacora de cambios:
- Se re escribio la función primos y renombro a
factoriza.
- La función factoriza ahora devuelve siempre
un array.
- Se añadio una función para darle formato al array
de salida de factoriza
LICENCIA
========
- Prohibido vender este script.
- Prohibida la redistribución sin mencionar de donde se
obtuvo (PHP-HISPANO.net), el autor (ZydRick) y su web
(http://www.zydrick.com/)
- Se puede modificar el código.
- Se puede usar con software que comparta la filosofía del
software libre y la comparta.
- Prohibido usarse con software propietario, a excepción de
aquellos que lo notifiquen al autor y este de su aprobación.
INFORMACIÓN DEL AUTOR
=====================
Autor: ZydRick
Email: zydrick(ARROBA)zydrick.com
www: www.zydrick.com
NOTAS
=====
- El autor no se hace responsable de los daños que pueda causar
este código.
- El autor no da soporte a personas ineptas que toquen el
código sin ningún conocimiento si quiera básico de PHP.
- El autor pide perdón por su mala ortografía.
- El autor no se hace responsable de ningun versión de este
código obtenido fuera de www.zydrick.com
[/Fin de las lineas que no se pueden ni borrar ni modificar]
*/
//Función que comprueba si un número $intN es primo
//si es primo devuelve true sino false
function es_primo($intN) {
$n = (int) $intN;
for($i = 2; $i < $n; $i++) {
if($n % $i == 0) {
return false;
}
}
return true;
}
//Extrae todos los factores de un número $intN
//Y devuelve un array con el formato siguiente
//$factor[factor]=numero al que esta elevado
function factoriza($intN) {
//definimos las variables $factores y $primos
//$factores lleba el array de salida
$factores=array();
//$primos es un array en el que registramos
//los números primos que usamos, con el fin
//de usar este array para saber si el factor
//es un número primo y así evitar cargar más
//de lo debido el servidor
$primos=array();
//Búcle para factorizar
for($i=2;;$i++) {
//comprobamos si es divisible el número
//en cuestion entre $i
if($intN % $i == 0) {
//Comprobamos si el número es primo
//para ello nos valomos del array
//y de la función es_primo
//++$factores[$i] solo incrementa
//en 1 la potencia del nº $i
//$intN lo dividimos para sacar
//el número que hay que factorizar
//la siguiente vez e $i--
//Resta $i por si $i vuelve a ser
//otro factor
if(in_array($i,$primos)) {
++$factores[$i];
$intN = $intN/$i;
$i--;
continue;
} elseif(es_primo($i)) {
++$factores[$i];
$intN = $intN / $i;
$primos[]=$i;
$i--;
continue;
}
//el siguiente elseif lo que hace
//es finalizar el búcle infinito
//cuando el número ya está factorizado
} elseif($intN == 1) {
break;
}
}
return $factores;
}
//Función para darle formato al array de salida de la factorización
//si $intOpt se deja como está (0) lo mostrará así:
//nº primo ^ potencdia · nº primo ^ potencia....
//Si pones cualquier otro valor (1; por ejemplo)
//lo mostrará de modo que aparecerá la potencia en
//la parte superior del número igual que si lo huviese
//escrito a boli
function print_format_array( $arrayFactores, $intOpt=0) {
//Definimos $return pa evitar problemas
$return='';
//comprobamos el valor de $intOpt y llebamos a cabo
//la acción correspondiente según el valor
if($intOpt == 0) {
//Creamos la cadena de salida con el búcle
foreach($arrayFactores as $num => $potencia) {
$return .= $num . '^' . $potencia . '·';
}
} else {
//Creamos la cadena de salida con el búcle
foreach($arrayFactores as $num => $potencia) {
$return .= $num . '<sup>' . $potencia . '</sup>·';
}
}
//Damos la salida a la cadena, usamos substr
//para evitar que salga el · (por) que deja
//el array al final
return substr($return,0,strlen($return)-1);
}
//Prueba
//Factorizamos el número
$factores=factoriza(2456787);
//Ahora le damos formato y lo ponemos en pantalla
//Posibilidad de formato 1
print print_format_array($factores,0).'<br>';
//Posibilidad de formato 2
print print_format_array($factores,1);