top of page

COSAS VEREDES

  • fjroar
  • 26 jul 2021
  • 7 Min. de lectura

Siguiendo un poco con la estela que abrí en R sobre el cómo utilizar R para ayudar a entender un poco la Teoría de Números, cité en un post anterior a la librería primes:



Pero sin duda la librería que realmente tiene una gran cantidad de funciones relacionadas con esta teoría es la que se denomina numbers (no confundir con la serie del mismo nombre, donde unos policías resuelven casos de modo totalmente inverosímiles haciendo razonamientos que en ocasiones se tardarían miles de años en que las máquinas acabaran sus resultados, mucho después de que el criminal muriese y perpetrara muchos más crímenes … hasta aquí mi crítica a la serie, ahora seguimos, disculpad jjjj)



Uno de los resultados claves de esta teoría es el denominado por Karl Friedrich Gauss como el Theorema Aureum, del que voy a hablar aquí un poco sobre curiosidades históricas y sobre cómo hacer uso de R para analizar algunas de los elementos que lo acompañan, aunque intentaré en la medida de lo posible hacerlo entendible, pero aviso que el enunciado en sí resulta un poco complicado.

Para entender el Theorema Aureum, hay que tener en cuenta que el ser humano intenta siempre generalizar el conocimiento de lo particular, sencillo y conocido, a otros marcos distintos y cada vez más generales. En este caso, a finales del siglo XVIII estaba emergiendo la Teoría de las Congruencias que Gauss sistematizará en sus Disquisitiones Arithmeticae.

Un grado más de detalle en este teorema, implica entrar en el concepto de cuerpo numérico que básicamente viene a ser como un conjunto de números con operaciones de suma, multiplicación, elemento nulo, neutro y que verifican un montón de propiedades; así pues un ejemplo de cuerpo es por supuesto conjunto de los números racionales (reales, complejos, etc); pero los matemáticos notaron de que no era necesario disponer de infinitos números para tener las propiedades anteriores, sino que se podían crear clases de equivalencia de modo por ejemplo que siempre que se contase de 7 en 7, justo en el número 7 empezaría el 0, es decir, el universo de los números se restringe a 0, 1, 2, 3, 4, 5, 6 y si por ejemplo aparecía un nuevo número, por ejemplo el 85, pues se hacía la división por 7 cuyo cociente es 12 y por tanto dado que 7 · 12 = 84 y hasta 85 hay 1 unidad, entonces 85 sería lo mismo que el número 1. Todo lo anterior se expresa en matemáticas como:


85 ≡ 1 mod(7)


Pues bien, siempre que lo que haya dentro de la expresión mod(p) sea un número primo p, se genera un cuerpo numérico con las propiedades que conocemos de adición, multiplicación con existencia de los elementos unidad y nulos que se conoce en cualquier otro cuerpo (además si el número no es primo, se obtienen menos propiedades, pero aún hay una estructura como es el caso de un anillo). Pues bien, en R hay muchas formas de resolver una congruencia y saber a que es equivalente, de hecho es lo mismo que calcular el resto de la división y así por ejemplo en la librería numbers bastaría con usar mod(85, 7) y se obtiene 1 pero aún es más sencillo si desde R base se utiliza 85%%7, por lo que hasta aquí "nada nuevo bajo el Sol".


Dado que se tenían infinitos cuerpos numéricos, tantos como números primos, y además sencillos de manejar, el siguiente paso que se plantea es la resolución de ecuaciones diofánticas (en números enteros) en dichos nuevos cuerpos. Una de tales ecuaciones de tipo diofántico es la siguiente:


a x ≡ b mod(m)


Claramente en esta expresión hay que despejar la x pero ¿Se puede siempre lograr solución como un número dentro del cuerpo (anillo)? Nótese que en el conjunto de los número racionales la solución es super sencilla (aquí no se aplica el tema módulo y se usa el signo =):


a x = b sí y sólo sí x = b / a si a no es 0


Ya por la época de Gauss el problema para la ecuación modular e incluso para sistemas lineales de ecuaciones de este tipo era bastante conocido y caracterizado para cualquier valor valor de m.


Pues bien, lo que se planteó a mitad del XVIII por Euler y donde Gauss en 1801 ofrece una prueba completa del resultado es la resolución de las expresiones siguientes:



Nótese que ya no se habla de un número m cualquiera, ya que se tiene que estar al menos en un cuerpo numérico y para ello el número con respecto al que se toma módulo debe ser primo, además una expresión es como la “espejo” o más bien la recíproca de la otra, de ahí el nombre de la Ley de Reciprocidad Cuadrática. Pues bien, este problema planteado y enunciado 1742 por Euler, resistió a ser demostrado por otro de los grandes del momento como era Legendre, y en este entorno de élite matemática, va un chaval de 19 años que se lo toma como reto personal, además no sólo es capaz de caracterizar las soluciones del anterior sistema, sino que por primera vez en 1801, publica una obra que es capaz de unificar y sintetizar gran parte de la teoría de números conocida hasta la época. Por otro lado, tanto le gustó la demostración del resultado, que llegó a dar a lo largo de su vida unas 8 demostraciones distintas (actualmente se conocen unas 233).

Un modo de simplificar la demostración del Teorema Aúreo es a través de la notación usada por Legendre en 1798 (que casi lo llegó a demostrar, pero … cachis, no lo logró). Legendre introduce una notación curiosa que en matemáticas se sigue denominando como Simbolo de Legendre y que se denota por (de modo parecido a una fracción con paréntesis):

Pues bien, la librería numbers tiene precisamente implementado dicha función de modo que somos capaces, analizar, tal y como se observa en la figura de la portada qué números del 1 al 100 son o no residuos cuadráticos de todos los primos entre 1 al 100. Una figura como la anterior se lograría en R con la siguiente sintaxis (los cuadrados en negros son aquellos cuyo Simbolo de Legendre vale 1 y en los blancos, este toma el valor de -1):


library(tidyverse)

library(ggplot2)

library(numbers)

m_legendre = matrix(nrow = 99, ncol = length(Primes(99)))

for (i in c(1: 99)){

for (j in c(1:ncol(m_legendre))){

m_legendre[i, j] = legendre_sym(i, Primes(99)[j])


}

}

m_legendre<- as.data.frame(m_legendre)


col_n <- paste0("p_", Primes(99))

col_n <- ifelse(nchar(col_n) == 3, paste0('p_0', substr(col_n, 3, 3)), col_n)

row_n <- paste0("n_", c(1: 99))

row_n <- ifelse(nchar(row_n) == 3, paste0('n_0', substr(row_n, 3, 3)), row_n)

names(m_legendre) <- col_n

rownames(m_legendre) <- row_n

m_legendre <- m_legendre %>%

as.data.frame() %>%

rownames_to_column("numbers1to100") %>%

pivot_longer(-c(numbers1to100), names_to = "primes1to100", values_to = "legendre")


m_legendre %>%

ggplot(aes(x=primes1to100, y=numbers1to100)) +

geom_tile(aes(fill=legendre)) +

scale_fill_gradient(low = "white", high = "black")


Y así pues tras todo este preámbulo, se enuncia el resultado que tanto llenaba de orgullo a Gauss:


Theorema Aureum

Dado el sistema:

1.- Si alguno de los primos p y q pertenecen a la sucesión 4k + 3 entonces una de las 2 congruencias cuadráticas tiene solución sí y sólo sí la otra no la tiene

2.- Si alguno de los primos p y q pertenecen a la sucesión 4k + 1 entonces o bien ambas congruencias tienen solución o bien ninguna de las 2 las tiene


Lo anterior por tanto se resume en la siguiente expresión en términos de Símbolo de Legendre:


Theorema Aureum (Versión 2)


Nótese que en el caso que p y q sean primos de la forma 4k + 3, el producto del exponente es impar y en caso contrario es par, valiendo respectivamente -1 y 1 el resultado de la izquierda. Por tanto como el símbolo de Legendre sólo puede valer 1, 0 ó -1, para que sea cierta la anterior igualdad, los signos deben estar cambiados (es decir, se tiene una congruencia y la otra no) y si son de la forma 4k + 3, entonces los signos deben de ser los mismo, es decir, o se tienen las 2 congruencias o no se tiene ninguna.


Para entender mejor el anterior resultado, se buscan 2 primos de la forma 4k + 1, uno de ellos puede ser directamente el número 5 y el otro podría ser el 13. Ahora ya se puede saber directamente si el sistema de ecuaciones siguiente tendrá o no solución:



Para ello se tiene que (5 – 1)(13- 1) / 4 = 12 y por tanto las 2 conguencias o tienen solución o no la tienen, para averiguarlo, usamos R:


legendre_sym(5, 13) = -1

legendre_sym(13, 5) = -1


Por tanto, el sistema anterior no es resoluble, pero sí lo sería por ejemplo el sistema formado por 13 y 17, en este caso:

legendre_sym(13, 17) = 1

legendre_sym(17, 13) = 1


De hecho aquí sale a la palestra otra interesante función de la librería modsqrt() que da una solución factible en caso de existir o 0, así pues ante los 2 caso anteriores se tiene que las soluciones, vía R son las siguientes:


modsqrt(13, 17) = 8, nótese que 8·8 – 13 = 3 · 17

modsqrt(17, 13) = 2, nótese que 2·2 – 17 = -1 · 13

Finalmente tal y como se ha visto, en el plano de las ecuaciones con cierta complejidad, la resolución puede resultar muy costosa conforme se sube de grado, se habla de reciprocidad cuadrática, pero también existe la cúbica y la bicuadrática y más generalizaciones, el nivel de dificultad aumenta exponencialmente y no sólo en lo que concierne a la demostración sino también a sus correspondientes enunciados ...


La Teoría de Números supone un reto en sus resultados, pero tras el reto intelectual llegan las aplicaciones reales, así que mientras que para Gauss demostrar lo anterior era un modo de decir al mundo “soy el más grande”, años después se descubre que existen aplicaciones más “mundanas” que una simple lucha intelectual, como son la criptografía y el diseño de difusores acústicos tipo Quadratic Residue Diffussor que aprovecha la simetría numérica que subyace bajo este hermoso resultado.

 
 
 

Para comenzar esta primera entrada de opinión, que doy fundamentada en datos, me gustaría comenzar por recordar brevemente lo que sucedía hace 15 años como estadístico. En aquella época la verdad es que no te hacían mucho caso en las empresas y en las instituciones y aunque eso sí, se ganaba menos dinero, al menos te dejaban en paz trabajar y aprender a gusto, te equivocabas o acertabas, pero podías aplicar todo tipo de algoritmos y datos disponibles sin ninguna cortapisa. Sin embargo, bajo la situación actual algunas cosas han cambiado, el Big Data irrumpió y todo el hype marketiniano acompañante, se han colocado en primeros puestos de interés las técnicas de Machine Learning y a los Data Scientist (muchos estadísticos o mineros de datos reconvertidos), que están migrando hacia la Inteligencia Artificial que adquiere ahora un mayor foco de atención hasta el punto de que surgen iniciativas que hablan de regulación que pueden tener cierto peligro si no se plantean correctamente (como el caso de la GDPR, pero eso lo dejo para otra entrada).

En relación con lo anterior, y por diversos motivos, se han puesto muy de moda los fallos en la aplicación de modelos estadísticos (ahora todo el mundo se fija en lo que hago, cachis ...) debido a lo que se denominan los sesgos como el sesgo de selección, máxime si dicho sesgo afecta sobre todo a cuestiones de género, edad, etc. A lo anterior hay que unir el mal uso de los datos, intencionado o no y la mezcla con ideas políticas un tanto peregrinas que pueden afectar, de modo muy negativo a la comunidad profesionales que viven de analizar datos y construir modelos.


Actualmente, tal y como se apunta en:


Se está planteando la regulación y si se lee el artículo, se ve un apoyo "contenido" a dicha regulación, siempre y cuando no sea excesiva (que una empresa diga que una regulación va a traer costes, implica que no lo ve claro por mucho que diga que le gusta, .... ¡No seamos ingenuos!). Por otro lado, existen numerosos sesgos cuando se crea un modelo o sistema de IA tal y como se apunta enhttps://www.eldiario.es/tecnologia/sesgos-genero-algoritmos-circulo-perverso-discriminacion-linea-vida-real_129_7198975.html pero no por ello debemos tomar decisiones en caliente y en algunos casos ideológicas que nos acaben llevando a sentencias del tipo “está prohibido incluir la variable sexo en los modelos estadísticos (ML, IA) en general

Es precisamente este punto el que voy a tratar sopesando los pro y contras de legislar hacia una supuesta mayor justicia de género y de las implicaciones que esto podría tener en un algoritmo sencillo como es un Generalize Linear Model o GLM (el razonamiento sería análogamente aplicable a cualquier otro algoritmo más complejo de tipo ML o de IA).

Antes de comentar lo anterior, no dejo pasar la oportunidad de dar una segunda opinión personal sobre lo habría que hacerse. Es decir, bajo mi punto de vista habría en todo caso que evitar el mal uso, o lo que es lo mismo, que un algoritmo peque de sesgo de selección o de sesgo de interacción y que dicho algoritmo lo esté usando por ejemplo google o facebook no puede habilitar a un político (o grupo de político) para la promulgación de prohibiciones generales (que es en lo que se traducirán las leyes al fin y al cabo), porque hay situaciones muy diversas. Que una determinada compañía no sepa controlar los sesgos o sencillamente no quiera controlarlos porque persigan un determinado fin más o menos lícito, será un problema que debería determinarse vía judicial u otros mecanismos hacia esa compañía y ese uso concreto, pero no por ello, por evitar un problema, se tengan crear otros nuevos. Es decir, convendría legislar sobre las actuaciones ilícitas no sobre cómo crear un modelo y qué elementos usar para crearlo.

El problema de la estadística, es como he apuntado antes, que al no ser matemáticas, hay una parte, la que procede de datos, que requiere interpretación y a veces la interpretación puede dar conclusiones que difieren y otras veces no tanto, por eso en el siguiente ejemplo voy a tratar de ser lo más objetivo a lo que puedo llegar ser, y por eso quiero señalar qué ocurriría si, por ejemplo, se elimina una variable poderosa en un modelo por un prejuicio moral o político.


Supongamos que estamos en 1913 y que tras el hundimiento del Titanic que ocurrió aproximadamente un año antes (a mitad de Abril de 1912), una compañía de seguros desea crear una póliza de vida para cubrir largos trayectos en transatlánticos, dicha póliza de vida, supongamos que consiste en dotar de 100.000$ al beneficiario que indique el asegurado, en el supuesto de que dicho asegurado fallezca por un hundimiento.

Ante el anterior caso, la compañía puede suponer que la probabilidad de hundimiento de una de estas naves en alta mar sea por ejemplo (dado el último hecho) de un 5%. En, ese caso sencillo, el precio medio justo aplicar a todo pasajero sería de unos 5.000$, claramente este precio es muy alto y muy poca gente (o nadie) lo adquiriría ya que hay que tener en cuenta que el precio de un billete de primera clase en el Titanic estaba en torno a los 4.350$ y además, con esta tarificación tan simple, si de 100 naves tipo transatlántico, hubiera una única persona que adquiriese la póliza, entonces el beneficio del asegurador en ese caso sería 0, porque en teoría se habrían hundido 5 de los 100, habría pagado a los beneficiarios 500.000$ a cambio de haber recibido en primas un total de 500.000$

En un segundo intento en la creación de una póliza adecuada y más competitiva, se pueda dotar al anterior análisis de un poco más de profundidad. Alguien puede pensar que de esos 5 accidentes que ocurrirían, es posible que haya una mínima tasa de superviviencia y que posiblemente, al menos 1 de los 5 asegurados que tuvieron la mala fortuna de que su transatlántico se hundiese en alta mar hubiera sobrevivido, además, si la compañía aseguradora tuviera los datos del Titanic, tal y como nos los ofrece por ejemplo kaggle en https://www.kaggle.com/c/titanic/data (ver train.csv), sabría que la probabilidad de supervivencia ante tal desastre estaría en torno al 37% - 39%, por lo que si se toma como referencia un valor inferior como 35%, se tendría que muy probablemente al menos 1 de los 5 asegurados sobreviviría y por tanto con la tarificación anterior, la compañía tendría 50.000$ de beneficio. Bajo este supuesto, otro modo de razonar sería ¿por qué no se aplica la probabilidad de no sobrevivir al desastre y se hace el producto más competitivo para que haya más personas que por menos dinero pueda adquirir el producto si lo desea? En este caso, cabría hacer, bajo este modelo tan simple la cuenta siguiente (se usa el valor 35% para que la compañía tenga un poco de beneficio y margen):

prima = 100.000 · 0.05 · (1 – 0.35) = 3.750


Claro el anterior precio, aunque mejora el primero, aún sigue siendo bastante alto y es entonces cuando se podría aplicar un procedimiento sencillo como el que se muestra con el siguiente código R:

library(data.table)

df <- fread('data/train.csv')

df$Pclass1 <- ifelse(df$Pclass == 1, 1, 0)

df$Pclass2 <- ifelse(df$Pclass == 2, 1, 0)

set.seed(10)

index <- sample(c(1:nrow(df)), 0.7*nrow(df))

df_train <- df[index,]

df_test <- df[-index,] #Se observa que las tasas de supervivencia son similares

mod1 <- glm(Survived ~ Pclass + Sex + SibSp, data = df_train, family = "binomial")

Que con un simple summary() daría lugar a la siguiente salida:




En este caso se observa que la probabilidad de que un hombre sobreviva al evento notoriamente inferior a que una mujer logre sobrevivir, por supuesto aquí es donde tiene lugar eso de “mujeres, niños y personas mayores primero”, el anterior modelo responde también a una ecuación tal como sigue:

P(Survived = 0) = 1 /(1 + exp(0.3332 -2.5703 Sexmale + 1.7804 Pclass1 + 1.2419 Pclass2))


En este caso, bajo este modelo tan sencillo, el peor valor de supervivencia la tendría un hombre con un billete de clase 3 y sería P(Survived = 0) = 0.90353 y por tanto el precio de la prima a cobrar sería muy elevado, pero en cambio, para un mujer que vaya en primera clase, el anterior valor sería P(Survived = 0) = 0.107782; por lo que en este caso, el valor de la prima sería:

prima(mujeres, clase 1)= 100.000 · 0.05 · 0.107782 = 539$

Es decir, ahora el precio para un segmento de la población si resulta competitivo, obviamente se puede pensar en si es justo o no ofrecer precios buenos a gente que adquiere un billete de primera clase, que además es de esperar que tenga dinero, y precios no tan buenos a los que adquieren un billete de segunda o tercera clase, pero claro, también se puede pensar del siguiente modo, y es que un billete de segunda clase en el Titanic costaba alrededor de 1750$, si se quiere asegurar al segmento de las mujeres de segunda clase, el coste compensaba bastante:

prima(mujeres, clase 2)= 100.000 · 0.05 · 0.1714906 = 858$


Y ¿para los de tercera clase? Bueno, en este caso, el precio de la póliza se dispara en el caso de las mujeres, pero hay que tener en cuenta que el coste del billete para ellos era de tan sólo 30$:

prima(mujeres, clase 3)= 100.000 · 0.05 · 0.4174622 = 2087$


No obstante, el producto, con sólo esas variables consideradas sencillamente no daría opción a que se aseguren, es más, la compañía de seguros tendría en todo caso un problema moral en este caso, pero las condiciones que indican los datos son las que son y entonces la tercera clase no tendría póliza a medida, ni incluso pagando 539$ podrían acceder al producto ya que sencillamente se estaría hablando de un coste de 54 veces su billete. Por tanto, la compañía aseguradora encontraría mercado, bajo este modelo entre la gente de primera y segunda clase (estos últimos lo más beneficiados en relación calidad-precio)

Pero ahora supongamos, que en el país de la aseguradora, algún comité ético ve inmoral y sancionable que se distinga por sexo y por tanto se obligue a eliminar la variable del modelo, en este caso, se tendría un modelo, con los mismos datos, tal como sigue:



En este caso, al no distinguirse por sexo, sólo se tendría la información del tipo de billete que se compra y en este caso las primas a aplicar serían:

prima(mujeres, clase 1)= 100.000 · 0.05 · 0.4025864 = 2023$

prima(mujeres, clase 2)= 100.000 · 0.05 · 0.4881772 = 2442$

prima(mujeres, clase 3)= 100.000 · 0.05 · 0. 7514574= 3757$

De modo que el asegurador sencillamente no haría negocio y es poco probable que alguien pagase los precios anteriores, salvo que se le asustase muchísimo, además quiénes más perjudicados salen son los pasajeros de 2ª clase, donde ahora la relación calidad-precio ya no está tan clara y obviamente, no se soluciona el problema de una póliza para la gente de 3ª clase.

Por tanto aquí está el debate ético cuando se desea eliminar una variable ¿Debe legislarse en cómo se construye un modelo de modo que se apliquen recetas tipo “café para todos”?


Este dataset Titanic me gusta porque da que pensar y plantea otros dilemas adicionales y es que como se observa, en este caso, los ricos tienen aparte de más dinero, para este tipo de modelos GLM, mejores ofertas que el resto, personalmente, a mí no me gusta esto, pero claro, yo no soy un empresario ni alguien que quiera apostar su dinero en crear una compañía de seguros, si lo fuera, tendría que empezar haciendo ofertas buenas a lo que me indica los datos, los cuales obedecen a un sesgo en el que impera varios condicionantes como:


  • Ante un naufragio, niños, mujeres, ancianos, suelen tener preferencia

  • Los medios disponibles para los que pagan un billete de clase 1 son superiores que para los que pagan un billete de clase 3

Claramente, si con el devenir de los tiempos, la segunda condición se hace más igualitaria y se tuvieran suficientes botes y medios adecuados a cada clase, lo que sucedería es que las variables dummy Pclass1 y Pclass2 irían perdiendo importancia y seguramente la probabilidad media de supervivencia habría sido superior al 50% y por tanto el modelo correcto a plantear es el que contuviese sólo la variable Sexo, ya que lo que no resulta tan ético es que un transatlántico no parta con todos los medios salvavidas adecuados y que además estuvieran sesgados para un determinado grupo de individuos, pero es otro debate que ya no sería "culpa" del modelo.


Obviamente si yo en 1913 tuviera que hacer un seguro de vida para este caso, buscaría más datos de otros naufragios y tendría que ver si la distribución de botes-salvavidas se parece más o menos a la del Titanic u a otros, junto con el uso de más variables, que de algún modo defina más el objeto del producto a tarificar, pero eso ya sería otra historia.

PD: el gráfico de la curva ROC que muestro al principio es la medida de la eficiencia del modelo considerando la variable sexo en el dataset test que no se había usado en la construcción del modelo. Se ve claramente cómo esta sencilla variable tipo 0-1 dota al modelo de una gran eficiencia discriminante separando los que sobreviven de los que no.

 
 
 

La Teoría de Números es sin duda, la reina de las matemáticas, aún a día de hoy existen numerosos enunciados muy fáciles de entender, pero a los que aún no hemos sido capaces de ofrecer una demostración definitiva.


En esta entrada quería hacer la presentación de una librería que existe en R y que se llama primes, que permite dar una visión un poco más geométrica a algunos problemas de esta maravillosa teoría, que debería ofrecerse tanto a nivel de facultad o inferior.


En este caso voy a hacer referencia al libro A Classical Introduction to Modern Number Theory, donde en sus primeras páginas se al conocido como Teorema de los Números Primos, demostrado al final del XIX por Hadamard y Vallé Poussin de modo independiente (nótese que estas cosas sucedían en esta época porque no existía internet …)

El teorema viene a establecer lo siguiente:


π(x) y x / ln(x) son infinitésimos equivalentes para x suficientemente grande


Donde π(x) es el número de primos entre 1 y x

Estoy seguro que nadie se sienta una tarde de verano y se pone a pensar sobre ¿Qué teorema demuestro hoy? Para llegar a un resultado como el anterior, seguro que pintaron en un plano cartesiano, por un lado los datos de la función π(x) y por otro los datos de la función x / ln(x) y se dieron cuenta que cuando x era muy grande, ambas funciones parecían que convergían a valores parecidos, pero claro, ponte tú a contar ahora, por ejemplo el número de primos entre por ejemplo 1 y 15.000

Para la desgracia de Hadamard y Vallé Poussin, el no tener en la época ordenadores y lenguajes como R que implementen funciones como las anteriores, daba además una dificultad extra al problema. Supongamos que se desea dibujar las gráficas de las funciones π(x) (en azul) y de f(x) = x / ln(x) (en naranja) en el intervalo 1 a 10.000.000 muestreando de 10.000 en 10.000, se podría hacer a partir de una función que existe en la librería que se denomina is_prime() generaría, con unas pocas líneas de código R una gráfica como la de la cabecera. Esta función indica, dada una lista de número cuál es primo y cuál no lo es y es mucho más recomendable su uso que otra función que dispone esta librería y que se denomina prime_count(), que en teoría estima el número de primos hasta una cierta cantidad, pero hace uso de los resultados existentes hasta día de hoy como el que se comenta en el siguiente párrafo, por lo que para la prueba que aquí se plantea no estaría demostrando nada.

Se observa que parece que las gráficas se separan, pero eso no ocurre indefinidamente, de hecho, se consigue acotar la función π(x), con una prueba de Pierre Durart en 2010 que consigue afinar un poco más estos resultados del siguiente modo:

x/(ln x – 1) < π(x) Si x > 5392

π(x) < x / (ln x – 1.1) Si x > 60183


A continuación se representa “nuestra” función π(x) , con las cotas anteriormente mencionadas bajo el mismo intervalo y muestreo de observaciones hasta obtener el siguiente gráfico:


Nótese que las 2 cotas, superior e inferior, están super-ajustadas de hecho, se hace una ampliación en la franja de los 8M y 9M se observa lo siguiente:



Un control prácticamente absoluto de la función π(x) que está restringida a las 2 franjas, mucho más exactas que el primer resultado de Hadamard y Vallé Poussin y es que la matemática moderna actual sigue aún obteniendo grandes resultados, donde antes no se podía.


Finalmente cabe comentar que esta función, de “contar” números primos y las desigualdades que se han ido demostrando, para poder conocer cómo se distribuyen estos, es otro de los grandes problemas de las matemática que lleva en boga los últimos 200 años y que sin duda, seguirá dando resultados aparentemente sencillos, pero para los que se requiere grandes dosis de ingenio.


Dado que existen este tipo de recursos en R (y creo que en python también), prometo comentar en próximos post, más resultados de esta índole que espero que os gusten.

 
 
 

© 2021 by Francisco J. Rodríguez Aragón. Proudly created with Wix.com

bottom of page