Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Erik# en 24 Julio 2009, 21:34 pm



Título: Libreria math.php
Publicado por: Erik# en 24 Julio 2009, 21:34 pm
Bueno, os dejo un tipo de libreria de matematicas con diversas funciones utiles, raiz cuadrada y raiz cubica dadas por SnakeDrak :P (Thx)

Código
  1. <?php
  2. function mcd($x, $y){ // saber el mcd de dos cifras
  3. $aux = $x;
  4.      if($x<$y){
  5.        $x=$y;
  6.        $y=$aux;
  7.      }
  8.      while(($r=$x%$y)!=0){
  9.        $x=$y;
  10.        $y=$r;
  11.     }
  12.     return $y;
  13. }
  14.  
  15. function mcm($x, $y){ // se requiere mcd() - Saber el mcm de dos cifras
  16. return (($x*$y)/(mcd($x,$y)));
  17. }
  18.  
  19. function nPrimo($n){ // saber si un numero es primo
  20. $ret=1;
  21.      for($i=2; $i<$n && $ret==1;$i++){
  22.        if(($n%$i)==0) $ret=0;
  23.      }
  24.      return $ret;
  25. }
  26.  
  27. function nxPrimo($i){ // saber el primo que va detras de otro
  28. $ret=$i+1;
  29.      while(nPrimo($ret)==0)
  30.        $ret++;
  31.      return $ret;
  32.  }
  33.  
  34. function cateto($h, $c){ // saber el cateto de una hipotenusa
  35. $c1 = $c * $c;
  36. $h1 = $h * $h;
  37. $a = $c1 - $h1;
  38. return raiz_q($a);
  39. }
  40. function hipotenusa($c1, $c2){
  41. $cc1 = $c1*$c1;
  42. $cc2 = $c2*$c2;
  43. $a = $cc1+$cc2;
  44. return raiz_q($a);
  45. }
  46.  
  47.  
  48. function elevar($n, $c){ // elevar un numero a otro
  49. $ret = 1;
  50. for($i = 0; $i < $c; $i++){
  51. $ret = $ret*$n;
  52. }
  53. return $ret;
  54. }
  55.  
  56. function raiz_q($n,$c=2){ // raices
  57. return pow($n,1/$c);
  58. }
  59.  
  60. ?>


Título: Re: Libreria math.php
Publicado por: Nakp en 24 Julio 2009, 22:15 pm
http://www.php.net/manual/en/book.math.php

sqrt()


Título: Re: Libreria math.php
Publicado por: Erik# en 24 Julio 2009, 22:22 pm
http://www.php.net/manual/en/book.math.php

sqrt()

No quiero una función ya hecha, ya se que existe, pero quiero crear mi propia función, igual que las potencias, existe pow, pero yo cree la de elevar();


Título: Re: Libreria math.php
Publicado por: Nakp en 24 Julio 2009, 22:42 pm
como ejercicio de programación y lógica es factible, pero realmente es útil para PHP?


Título: Re: Libreria math.php
Publicado por: Erik# en 24 Julio 2009, 22:53 pm
No, pero es util para mi aprendizaje y tener una optativa a las funciones standard de PHP que en casos remotos puede saltar error :P


Título: Re: Libreria math.php
Publicado por: SnakeDrak en 24 Julio 2009, 23:19 pm
Hola,

Pues muy fácil, la raíz cuadrada es igual a:

Número de la raíz elevado a 1/2.

Es decir, que te quedaría:

Código
  1. function raiz_q($n){
  2.      return elevar($n,0.5);
  3. }
  4.  

La podrías adaptar para raízes cúbicas y tal:

Código
  1. function raiz_q($n,$c){ // $n raíz a calcular, $c tipo (cuadrada sería 2)
  2.      return elevar($n,1/$c);
  3. }
  4.  

Saludos!


Título: Re: Libreria math.php
Publicado por: Erik# en 24 Julio 2009, 23:27 pm
Hola,

Pues muy fácil, la raíz cuadrada es igual a:

Número de la raíz elevado a 1/2.

Es decir, que te quedaría:

Código
  1. function raiz_q($n){
  2.      return elevar($n,0.5);
  3. }
  4.  

La podrías adaptar para raízes cúbicas y tal:

Código
  1. function raiz_q($n,$c){ // $n raíz a calcular, $c tipo (cuadrada sería 2)
  2.      return elevar($n,1/$c);
  3. }
  4.  

Saludos!

Resultado total:

Código
  1. <?php
  2. function mcd($x, $y){ // saber el mcd de dos cifras
  3. $aux = $x;
  4.      if($x<$y){
  5.        $x=$y;
  6.        $y=$aux;
  7.      }
  8.      while(($r=$x%$y)!=0){
  9.        $x=$y;
  10.        $y=$r;
  11.     }
  12.     return $y;
  13. }
  14.  
  15. function mcm($x, $y){ // se requiere mcd() - Saber el mcm de dos cifras
  16. return (($x*$y)/(mcd($x,$y)));
  17. }
  18.  
  19. function nPrimo($n){ // saber si un numero es primo
  20. $ret=1;
  21.      for($i=2; $i<$n && $ret==1;$i++){
  22.        if(($n%$i)==0) $ret=0;
  23.      }
  24.      return $ret;
  25. }
  26.  
  27. function nxPrimo($i){ // saber el primo que va detras de otro
  28. $ret=$i+1;
  29.      while(nPrimo($ret)==0)
  30.        $ret++;
  31.      return $ret;
  32.  }
  33.  
  34. function cateto($h, $c){ // saber el cateto de una hipotenusa
  35. $c1 = $c * $c;
  36. $h1 = $h * $h;
  37. $a = $c1 - $h1;
  38. return raiz_q($a);
  39. }
  40. function hipotenusa($c1, $c2){
  41. $cc1 = $c1*$c1;
  42. $cc2 = $c2*$c2;
  43. $a = $cc1+$cc2;
  44. return raiz_q($a);
  45.  
  46.  
  47. function elevar($n, $c){ // elevar un numero a otro
  48. $ret = 1;
  49. for($i = 0; $i < $c; $i++){
  50. $ret = $ret*$n;
  51. }
  52. return $ret;
  53. }
  54.  
  55. function raiz_q($n){ // raiz cuadrada, (por SnakeDrak)
  56. return elevar($n,0.5);
  57. }
  58.  
  59. function raiz_q2($n,$c){ // raices cubicas (por SnakeDrak)
  60.      return elevar($n,1/$c);
  61. }
  62. ?>

Muchas gracias, porfin puedo finalizar las otras funciones que necesitaba este recurso :P
Actualizo el primer post.


Título: Re: Libreria math.php
Publicado por: Erik# en 24 Julio 2009, 23:38 pm
No funciona con decimales mi función elevar :S


Título: Re: Libreria math.php
Publicado por: SnakeDrak en 25 Julio 2009, 00:48 am
Hola,

Habría que hacer el algoritmo y ya, porque elevar a un decimal es igual que elevar a una fracción y elevar a una fracción es igual a una raíz xDDD así que habría que hacer el algoritmo (no encontré ninguno hecho en google), que de el resultado de la raíz, el algoritmo está en Wikipedia (ese que se da en la ESO) y ya desde eso podrías hacerlo, pero vamos que es mucho mejor que uses POW obviamente ya que tus funciones consumen más que las librerías de PHP que irán en ASM supongo.

Si te haces el algoritmo ponlo por aquí que vendría bien.

Por cierto recuerda poner (float) a las variables que tendrán decimales, también puedes usar double, ejemplo:

Código
  1. return (float)$var;
  2.  
  3. $var = (float) (5*(1/2));
  4.  
  5. // etc..
  6.  

Saludos!


Título: Re: Libreria math.php
Publicado por: Erik# en 25 Julio 2009, 00:55 am
Bueno, tenedremos que usar en las funciones de raiz cuadrada un sistema pre-fabricado como es pow, a mi aun no me han explicado nada sobre algoritmos, ahora empezare 3º ESO.
Espero que me empiecen a explicar algebra avanzada y algoritmos y logaritmos de cifrado y creación de ordenes matematicas :P


Título: Re: Libreria math.php
Publicado por: SnakeDrak en 25 Julio 2009, 01:40 am
Hola,

Pero el algoritmo de la raíz es el cálculo de la raíz, es decir, las operaciones que se deben seguir para averiguar el valor de una raíz cuadrada, se da creo que en 3 de ESO o 2 pero como hay calculadoras pues nunca se usa.

Por cierto no entendiste bien lo de la raíz:

Código
  1. function raiz_q($n){ // raiz cuadrada, (por SnakeDrak)
  2. return pow($n,0.5);
  3. }
  4.  
  5. function raiz_q2($n,$c){ // raices cubicas (por SnakeDrak)
  6.      return pow($n,1/$c);
  7. }
  8.  

La primera es 0.5 (1/2) pero la segunda sirve para todos, es decir:

Código
  1. raiz_q2(27,3); // Devuelve raíz cúbica de 27
  2. raiz_q2(9,2); // Devuelve raíz cuadrada de 9
  3.  

1/2 es cuadrada, 1/3 es cúbica.. etc xD, por eso, o pon solo una o haz algo así:

Código
  1. // Por defecto raices cuadradas
  2. function raiz_q($n,$c=2){ // raices ej: raiz_q(9) == 3, raiz_q(27,3) == 3
  3. return pow($n,1/$c);
  4. }
  5.  

Para que entiendas:

RAÍZ n { N } == N^(1/n)

Es decir, la raíz cuadrada (2) de 9:

RAÍZ 2 { 9 } == 9^(1/2) == 3

La raíz cúbica (3) de 27:

RAÍZ 3 { 27 } == 27^(1/3) == 3

Saludos!


Título: Re: Libreria math.php
Publicado por: Erik# en 25 Julio 2009, 11:13 am
Gracias, ahora me quedo más claro :P


Título: Re: Libreria math.php
Publicado por: SnakeDrak en 25 Julio 2009, 17:55 pm
Hola,

Entonces usa solo está función:

Código
  1. // Por defecto raices cuadradas
  2. function raiz_q($n,$c=2){ // raices ej: raiz_q(9) == 3, raiz_q(27,3) == 3
  3. return pow($n,1/$c);
  4. }
  5.  

Así no hace falta dos, si quieres raíz cuadrada pues:
Código
  1. raiz_q(9); // Devuelve raíz cuadrada de 9
  2. raiz_q(27,3); // Devuelve raíz cúbica de 9
  3.  

Así con una función tienes para cualquier tipo de raíz.

Saludos!


Título: Re: Libreria math.php
Publicado por: Anibal784 en 25 Julio 2009, 20:00 pm
Cita de: EriK#
No quiero una función ya hecha, ya se que existe, pero quiero crear mi propia función, igual que las potencias, existe pow, pero yo cree la de elevar();
Código
  1. function raiz_q($n,$c=2){ // raices
  2. return pow($n,1/$c);
  3. }
  4.  
¿dónde está definida pow?

Cita de: Erik#
No, pero es util para mi aprendizaje y tener una optativa a las funciones standard de PHP que en casos remotos puede saltar error
Na na na, nene, si la función standar de PHP llega a fallar, estamos bastante en el horno, colapsa la internet :P, por motivos de aprendizaje está bien, nada más, otra cosa, las funciones que trae PHP son probadas (y sobre todo las matemáticas) y mucho más rápidas.


Título: Re: Libreria math.php
Publicado por: Erik# en 25 Julio 2009, 20:12 pm
Cita de: EriK#
No quiero una función ya hecha, ya se que existe, pero quiero crear mi propia función, igual que las potencias, existe pow, pero yo cree la de elevar();
Código
  1. function raiz_q($n,$c=2){ // raices
  2. return pow($n,1/$c);
  3. }
  4.  
¿dónde está definida pow?

Cita de: Erik#
No, pero es util para mi aprendizaje y tener una optativa a las funciones standard de PHP que en casos remotos puede saltar error
Na na na, nene, si la función standar de PHP llega a fallar, estamos bastante en el horno, colapsa la internet :P, por motivos de aprendizaje está bien, nada más, otra cosa, las funciones que trae PHP son probadas (y sobre todo las matemáticas) y mucho más rápidas.

Más que nada es por practica, y además las funciones como mcd, mcm... son utiles :)


Título: Re: Libreria math.php
Publicado por: SnakeDrak en 25 Julio 2009, 22:01 pm
Hola,

Annibal solo está practicando sus matemáticas pero no creo que vaya a hacer el algoritmo del cálculo de la raíz en PHP, por eso usa pow para la raíz para que al menos tenga claro que 4^(1/2) == Raíz cuadrada de 4 xD.

Obviamente las de php consumen mucho menos pero por ejemplo en las olimpiadas de informática joven algunas veces te piden algoritmos así que tienes que crear tú sin usar la función que ya existe.

Si eso luego haré el algoritmo para calcular la raíz sin necesidad de pow.

Saludos!