Menu Web




*Nota: Por fin se ha conseguido lanzarse el software de la primera versión alfa demo.

Enlace de descarga: JLeng & JCalc Versión 0.0.0.1


Nota del software "JLeng & JCalc": Posiblemente hay un bug en el acarreo de la suma, por lo que como resultado puede que la suma, multiplicación y potencia den resultados erróneos por un lanzamiento precipitado del propio software, por lo que se está intentado corregir el bug para la versión del software 0.0.0.2, aparte de añadir mejoras y etc a la versión 0.0.0.2, se está trabajando para la creación de la versión 0.0.0.2, aún tardará un tiempo antes de lanzarse al público, espero que el usuario tenga paciencia para la obtención de la versión 0.0.0.2 para ver los cambios realizados, aparte de que todavía no está disponible del todo la disponibilidad del motor gráfico para la inclusión del proyecto del software para "JLeng & JCalc", ya que se está diseñando las estructuras que hará que el software pueda hacer gráficos o videojuegos simples de momento, sorpresa para los usuarios que prefieran utilizar el software "JLeng & JCalc".

Nota del software "JLeng & JCalc": Hay posibles beneficios de usar el lenguaje de programación JLeng del software, ya que al permitir espacios en identificadores de variables, funciones y etc, podrá obtenerse beneficios del mismo lenguaje de programación, nada de CamelCase o similares. Hay que investigar los beneficios del mismo. También de paso indicar que hay que documentar por parte del fundador del lenguaje la sintaxis del mismo lenguaje de programación para que los usuarios comprendan mejor el uso del mismo lenguaje de programación, eso se hará próximamente, poco a poco, según el tiempo disponible del fundador. Gracias de antemano por la paciencia de los usuarios que prefieran utilizar el software "JLeng & JCalc".

viernes, 3 de mayo de 2024

Primalidad

#include <iostream>
using namespace std;
#include <sstream>
#include <cmath>

#define FOR(A,B) for(unsigned long long i=A;i<=B;i++)
#define repite(A) FOR(1,A)

string convertiratexto(unsigned long long a);

unsigned long long encontrarDiferenciaSiguientePrimo(unsigned long long numeroPrimoAnterior);

unsigned long long enesimoPrimo(unsigned long long n);

unsigned long long compuesto(unsigned long long n);

unsigned long long compuesto_par(unsigned long long n);

unsigned long long compuesto_impar(unsigned long long n);

unsigned long long nextPrimo(unsigned long long n);

unsigned long long funcionAuxFactorizacion(unsigned long long a, unsigned long long b);

string encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux);

string factorizacion(unsigned long long n);

string if_encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux);

string if_factorizacion(unsigned long long n);

float serie_inversa_de_primos(unsigned long long n);

int main() {
	unsigned long long numero_primo, numero_compuesto, numero_compuesto_par, numero_compuesto_impar, numero_next_primo, numero_factorizacion, numero_if_factorizacion, numero_serie_inversa_primos, numero_menores;
	
    cout << "Escribe un numero natural para encontrar el enesimo numero primo asociado al natural:" << endl;
	cin >> numero_primo;
	cin.ignore();
	cin.clear();
	cout << enesimoPrimo(numero_primo) << endl;
	
    cout << "Escribe un numero natural para encontrar el enesimo numero compuesto asociado al natural:" << endl;
	cin >> numero_compuesto;
	cin.ignore();
	cin.clear();
	cout << compuesto(numero_compuesto) << endl;
	
	cout << "Escribe un numero natural para encontrar el enesimo numero compuesto par asociado al natural:" << endl;
	cin >> numero_compuesto_par;
	cin.ignore();
	cin.clear();
	cout << compuesto_par(numero_compuesto_par) << endl;
	
	cout << "Escribe un numero natural para encontrar el enesimo numero compuesto impar asociado al natural:" << endl;
	cin >> numero_compuesto_impar;
	cin.ignore();
	cin.clear();
	cout << compuesto_impar(numero_compuesto_impar) << endl;
	
	cout << "Escribe un numero natural para encontrar el siguiente numero primo:" << endl;
	cin >> numero_next_primo;
	cin.ignore();
	cin.clear();
	cout << nextPrimo(numero_next_primo) << endl;
	
	cout << "Escribe un numero natural para encontrar la factorizacion" << endl;
	cin >> numero_factorizacion;
	cin.ignore();
	cin.clear();
	cout << factorizacion(numero_factorizacion) << endl;
	
	cout << "Escribe un numero natural para encontrar la factorizacion compuesto o verificar si es primo, (devuelve primo en caso de ser verdadero)" << endl;
	cin >> numero_if_factorizacion;
	cin.ignore();
	cin.clear();
	cout << if_factorizacion(numero_if_factorizacion) << endl;
	
	cout << "Escribe un numero natural para encontrar la serie inversa de numeros primos" << endl;
	cin >> numero_serie_inversa_primos;
	cin.ignore();
	cin.clear();
	cout << serie_inversa_de_primos(numero_serie_inversa_primos) << endl;
	
	cout << "Escribe un numero natural para encontrar los numeros primos menores al numero natural" << endl;
	cin >> numero_menores;
	cin.ignore();
	cin.clear();
	
	unsigned long long numero_primo_menores=2;
	while (numero_primo_menores<numero_menores) {
		cout << numero_primo_menores << endl;
		if (numero_primo_menores==2) {
			numero_primo_menores=3;
		} else
		{
			numero_primo_menores+=encontrarDiferenciaSiguientePrimo(numero_primo_menores);
		}
	}
	
	system("pause");
	
	return 0;
}

string convertiratexto(unsigned long long a) {
	stringstream b;
	b << a;
	return b.str();
}

unsigned long long encontrarDiferenciaSiguientePrimo(unsigned long long numeroPrimoAnterior) {
    // numeroParaDividirPrimo empieza en 2, porque el número 2 es el primer número primo
    // después, se le suma una diferencia para hallar el siguiente primo, para que
    // numeroParaDividir sea siempre un número primo.
    unsigned long long numeroParaDividir = 2;
    // empieza la diferencia en 2, hasta hallar la diferencia.
    unsigned long long diferencia = 2;

    while (true) {
        if (ceil(sqrt(numeroPrimoAnterior + diferencia)) <= numeroParaDividir && (numeroPrimoAnterior + diferencia) % numeroParaDividir != 0) {
            return diferencia;
        } else {
            if ((numeroPrimoAnterior + diferencia) % numeroParaDividir != 0) {
                if (numeroParaDividir == 2) {
                    numeroParaDividir = 3;
                } else {
                    numeroParaDividir += encontrarDiferenciaSiguientePrimo(numeroParaDividir);
                }
            } else {
                numeroParaDividir = 2;
                diferencia += 2;
            }
        }
    }
}

unsigned long long enesimoPrimo(unsigned long long n) {
    if (n == 0) {
        // Caso especial para n = 0 (podría considerarse un error)
        return 0;
    }
	if (n == 1) {
        return 2;
    }
	if (n == 2) {
        return 3;
    }
	unsigned long long numeroLimit = n - 2;
	unsigned long long sucesion = 3;

	for (unsigned long long i = 1; i <= numeroLimit; i++) {
		sucesion += encontrarDiferenciaSiguientePrimo(sucesion);
	}

	return sucesion;
}

unsigned long long compuesto(unsigned long long n) {
	if (n == 0) {
        // Caso especial para n = 0 (podría considerarse un error)
        return 0;
    }
    unsigned long long primo=2;
	unsigned long long solucion=2;
	repite(n) {
		if (i>1) {solucion++;}
		
		while (solucion>=primo) {
			while (solucion>primo) {
				if (primo==2) {
					primo=3;
				} else {
					primo+=encontrarDiferenciaSiguientePrimo(primo);
				}
			}
			
			while (solucion==primo) {
				if (primo==2) {
					primo=3;
				} else {
					primo+=encontrarDiferenciaSiguientePrimo(primo);
				}
				solucion++;
			}
		}
	}
	
	return solucion;
}

unsigned long long compuesto_par(unsigned long long n) {
	if (n == 0) {
        // Caso especial para n = 0 (podría considerarse un error)
        return 0;
    }
    return 2*n+2;
}

unsigned long long compuesto_impar(unsigned long long n) {
	if (n == 0) {
        // Caso especial para n = 0 (podría considerarse un error)
        return 0;
    }
    unsigned long long primo=2;
	unsigned long long solucion=3;
	repite(n) {
		if (i>1) {solucion+=2;}
		
		while (solucion>=primo) {
			while (solucion>primo) {
				if (primo==2) {
					primo=3;
				} else {
					primo+=encontrarDiferenciaSiguientePrimo(primo);
				}
			}
			
			while (solucion==primo) {
				if (primo==2) {
					primo=3;
				} else {
					primo+=encontrarDiferenciaSiguientePrimo(primo);
				}
				solucion+=2;
			}
		}
	}
	
	return solucion;
}

unsigned long long nextPrimo(unsigned long long n) {
	if (n==0 || n==1) {
		return 2;
	} else
	if (n%2==0) {
		return (n-1)+encontrarDiferenciaSiguientePrimo(n-1);
	} else
	{
		return n+encontrarDiferenciaSiguientePrimo(n);
	}
}

//

unsigned long long funcionAuxFactorizacion(unsigned long long a, unsigned long long b) {
	if (a==b) {
		return 1;
	}
	if (a<b) {
		return 0;
	}
	{
		unsigned long long solucion=1, digit=9, Aux=1, potencia=pow(b,solucion);
		while (a%potencia>=pow(10,Aux)*digit) {
			cout << "ii: " << solucion << endl;
			solucion+=pow(10,Aux)*digit;
			if(digit>1) {
				digit--;
			}
			if(digit==1) {
				Aux++;
				digit=9;
			}
			potencia=pow(b,solucion);
		}
		while (a%potencia==0) {
			solucion++;
			potencia=pow(b,solucion);
		}
		solucion--;
		return solucion;
	}
}

string encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux) {
	string solucion="";
	while(n>0) {
		if (verificadorAux==primo) {
			if (verificadorAux==true) {
				solucion = convertiratexto(n)+" es primo";
			} else
			{
				solucion = solucion+convertiratexto(n);
			}
			n=0;
		} else
		{
			if (primo>ceil(sqrt(n))) {
				if (verificadorAux==true) {
					solucion = convertiratexto(n)+" es primo";
				} else
				{
					solucion = solucion+convertiratexto(n);
				}
				n=0;
			} else
			{
				if (n%primo==0) {
					
					if (funcionAuxFactorizacion(n,primo)>1) {
						
						if (primo==2) {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
								n=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo=3;
								verificadorAux=false;
							}
						} else {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
								n=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo+=encontrarDiferenciaSiguientePrimo(primo);
								verificadorAux=false;
							}
						}
						
					} else {
						
						if (primo==2) {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
								solucion = solucion+convertiratexto(primo);
								verificadorAux=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo=3;
								verificadorAux=false;
							}
						} else {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
								solucion = solucion+convertiratexto(primo);
								n=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo+=encontrarDiferenciaSiguientePrimo(primo);
								verificadorAux=false;
							}
						}
						
					}
				} else {
					
					if (n>primo && n%primo!=0) {
						if (primo==2) {
							primo=3;
						} else {
							primo+=encontrarDiferenciaSiguientePrimo(primo);
						}
					} else {
						solucion = "1^1";
						n=0;
					}
				}
			}
		}
	}
	
	return solucion;
}

string factorizacion(unsigned long long n) {
	if (n == 0) {
        // Caso especial para n = 0 (podría considerarse un error)
        return "0";
    }
	if (n==1) {
		return "1";
	}
	if (n==2) {
		return "2 es primo";
	}
	return encuentraFactorizacion(n, 2, true);
}

string if_encuentraFactorizacion(unsigned long long n, unsigned long long primo, bool verificadorAux) {
	string solucion="";
	while(n>0) {
		if (verificadorAux==primo) {
			if (verificadorAux==true) {
				solucion = "primo";
			} else
			{
				solucion = solucion+convertiratexto(n);
			}
			n=0;
		} else
		{
			if (primo>ceil(sqrt(n))) {
				if (verificadorAux==true) {
					solucion = "primo";
				} else
				{
					solucion = solucion+convertiratexto(n);
				}
				n=0;
			} else
			{
				if (n%primo==0) {
					
					if (funcionAuxFactorizacion(n,primo)>1) {
						
						if (primo==2) {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
								n=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo=3;
								verificadorAux=false;
							}
						} else {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo));
								n=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"^"+convertiratexto(funcionAuxFactorizacion(n,primo))+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo+=encontrarDiferenciaSiguientePrimo(primo);
								verificadorAux=false;
							}
						}
						
					} else {
						
						if (primo==2) {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),3, false)=="1") {
								solucion = solucion+convertiratexto(primo);
								verificadorAux=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo=3;
								verificadorAux=false;
							}
						} else {
							if (encuentraFactorizacion(n/(pow(primo,funcionAuxFactorizacion(n,primo))),primo+encontrarDiferenciaSiguientePrimo(primo), false)=="1") {
								solucion = solucion+convertiratexto(primo);
								n=0;
								verificadorAux=false;
							} else
							{
								solucion = solucion+convertiratexto(primo)+"*";
								n/=(pow(primo,funcionAuxFactorizacion(n,primo)));
								primo+=encontrarDiferenciaSiguientePrimo(primo);
								verificadorAux=false;
							}
						}
						
					}
				} else {
					
					if (n>primo && n%primo!=0) {
						if (primo==2) {
							primo=3;
						} else {
							primo+=encontrarDiferenciaSiguientePrimo(primo);
						}
					} else {
						solucion = "1^1";
						n=0;
					}
				}
			}
		}
	}
	
	return solucion;
}

string if_factorizacion(unsigned long long n) {
	if (n == 0) {
        // Caso especial para n = 0 (podría considerarse un error)
        return "numero no permitido";
    }
	if (n==1) {
		return "1";
	}
	if (n==2) {
		return "primo";
	}
	return if_encuentraFactorizacion(n,2, true);
}

float serie_inversa_de_primos(unsigned long long n) {
	unsigned long long primo=2;
	float serie=0;
	FOR(1,n) {
		if (i!=1) {
			if (primo==2) {
				primo=3;
			} else
			{
				primo+=encontrarDiferenciaSiguientePrimo(primo);
			}
		}
		serie=serie+(1/(float)primo);
	}
	return serie;
}