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);
PHP-Hispano.net - Porque al final, todos acabamos aprendiendo.