ESPIRAL
La Espiral de SACKs
La espiral de Sacks es una especie de variante de la espiral de Ulam descubierta por Robert Sacks en 1994. La idea es colocar todos los números naturales, comenzando desde el cero, sobre una espiral de Arquímedes. Se construye de la siguiente forma:
Colocamos el cero en el comienzo de la espiral. Después vamos colocando los números enteros positivos sobre la espiral a distancia proporcional haciendo que los cuadrados perfectos queden alineados hacia la derecha en la fila central. Algo así:
La idea ahora es resaltar los primos sobre los compuestos.
Como podéis ver la situación es parecida a la de la espiral de Ulam: una cierta disposición de los números naturales que no debería tener demasiada importancia en la que resaltamos los números primos.
Posiblemente a la larga se descubra que en realidad no la tiene, pero en este caso también aparecen situaciones cuanto menos curiosas. La siguiente imagen muestra la espiral de Sacks para 2026 puntos:
Comienzan a intuirse ciertas curvas como más primos que otras. Veamos una imagen con más puntos, en concreto con 46656:
Ahora se ven más claramente algunas curvas con una realmente destacable densidad de números primos, como la señalada con la flecha. No creo que pueda negarse que esto convierte a este tipo de construcciones en objetos dignos de estudio. Quién sabe si en algún momento pudieran servir para predecir la situación de números primos realmente grandes.
El estudio que puede realizarse de los detalles de esta construcción es bastante amplio. Por ejemplo, pueden reconocerse muchas curvas cuyos elementos tienen características comunes, como que todos tienen una descomposición en factores similar o que están relacionados con el mismo polinomio de segundo grado.
El matemático polaco Stanislaw Ulam (1909-1986) asistía, en 1963, a una charla científica y se estaba aburriendo. Para distraerse dispuso, sobre un papel, los números en espiral y los fue señalando los primos como se ve en la imagen.
Comprobó que, curiosamente, los primos se alineaban con cierta preferencia en algunas líneas diagonales de la disposición. Se observa en la imagen de la derecha a partir de la de la izquierda, en la que se han señalado los números primos con puntos:
Ese patrón, inesperado y sorprendente, le hizo intuir que los números primos no se distribuyen, a lo largo de los números naturales, tan aleatoriamente como parece.
primespObservemos, con un mapa mucho más grande, cómo se distribuyen los primos según esta espiral y confirmamos la conjetura de que existen rectas (con su correspondiente ecuación algebraica) en los que los números primos se presentan con una abundancia inusual.
A partir de esta espiral han surgido otras similares como la espiral de Sacks a partir de la disposición de los números según la espiral de Arquímedes, en la que también aparecen remarcadas líneas (en este caso parábolas) que determinan conjuntos con abundancia significativa de primos
CODIGO EN JAVA
CODIGO EN JAVA
import java.util.*;
public class Main {
public static void main(String[] args) {
int n;
int matriz[][] = new int[20][20];
n=6;
System.out.print("\tENTRADA 1 ESPIRAL");
System.out.println();
Entrada1(generarMatrizCaracol(n, 1), n, n);
System.out.println();
System.out.print("\tENTRADA 2 ESPIRAL");
System.out.println();
Entrada2(generarMatrizCaracol(n, 1), n, n);
System.out.println();
System.out.print("\tENTRADA 3 ESPIRAL");
System.out.println();
Entrada3(generarMatrizCaracol(n, 1), n, n);
System.out.print("\tENTRADA 4 ");
System.out.println();
Entrada4(generarMatrizCaracol(n, 1), n, n);
System.out.println();
System.out.print("\tENTRADA 6 ESPIRAL");
System.out.println();
Entrada6(generarMatrizCaracol(n, 1), n, n);
System.out.println();
System.out.print("\tENTRADA 7 ESPIRAL");
System.out.println();
Entrada7(generarMatrizCaracol(n, 1), n, n);
System.out.println();
System.out.print("\tENTRADA 8 ESPIRAL ");
System.out.println();
Entrada8(generarMatrizCaracol(n, 1), n, n);
System.out.println();
System.out.print("\tENTRADA 11 ");
System.out.println();
Entrada11(generarMatrizCaracol(n, 1), n, n);
}
public static int[][] generarMatrizCaracol(int n, int x) {
int[][] M = new int[n + 1][n + 1];
for (int a = 1; a <= n / 2; a++) {
for (int i = a; i <= n - a; i++) {
M[a][i] = x;
x++;
}
for (int i = a; i <= n - a; i++) {
M[i][n - a + 1] = x;
x++;
}
for (int i = n - a + 1; i >= a + 1; i--) {
M[n - a + 1][i] = x;
x++;
}
for (int i = n - a + 1; i >= a + 1; i--) {
M[i][a] = x;
x++;
}
}
if (n % 2 == 1) {
M[n / 2 + 1][n / 2 + 1] = x;
}
return M;
}
public static void Entrada1(int[][] M, int f, int c)
{
for (int i = 1; i <= f; i++)
{
for (int j = 1; j<= c; j++)
{
System.out.print("\t" + M[i][j]);
}
System.out.println();
}}
public static void Entrada2(int[][] M, int f, int c)
{
for (int i=f; i>=1; i--)
{
for (int j=1; j<=c; j++){
System.out.print("\t" + M[i][j]);
}
System.out.println();
}}
public static void Entrada3(int[][] M, int f, int c)
{
for (int i=f; i>=1; i--){
for (int j=c; j>=1; j--){
System.out.print("\t" + M[i][j]);
}
System.out.println();
}}
public static void Entrada6(int[][] M, int f, int c)
{
for (int i=1; i<=f; i++)
{
for (int j=c; j>=1; j--){
System.out.print("\t" + M[i][j]);
}
System.out.println();}}
public static void Entrada7(int[][] M, int f, int c)
{
for (int j=f; j>=1; j--)
{
for (int i=c; i>=1; i--)
{
System.out.print("\t" + M[i][j]);
}
System.out.println();}}
public static void Entrada8(int[][] Mat, int f, int c)
{
int n=f;
int n2=f;
int con=0;
for (int j=1; j<=n; j++){if (con==n)
{ System.out.print("\n");
for (int k=1; k<=n; k++)
{
System.out.print("\t" + Mat[k][j]);
con=con+1;}
con=con-n;}
if (con==0)
{
for (int i=1; i<=n; i++)
{
System.out.print("\t" + Mat[i][j]);
con=con+1;
}}}}
public static void Entrada4(int[][] M, int f, int c)
{
int n=f;
int n2=f;
int con;
int s;
con=0;
s=0;
int j,i,k;
s=-1;
int[][] Mat = new int[n + 1][n + 1];
for (i=0;i<=n;i++)
{
for (j=0;j<=n;j++)
{
//s=s+1;
//Mat[i][j]=s;
//System.out.print("\t" + Mat[i][j]);
}
}
s=-f+(f-1);
for(j=n; j>=1; j--)
{if (con==n){
System.out.print("\n");
for (k=0; k<=n-1; k++)
{ s=s+1;
Mat[k][j]=s;
System.out.print("\t" + Mat[k][j]);
con=con+1;}
con=con-n;
}
if (con==0)
{System.out.print("\n");
s=s+1;
//Mat[i][j]=s;
for (i=0; i<=n-1; i++)
{
s=s+1;
Mat[i][j]=s;
System.out.print("\t" + Mat[i][j]);
con=con+1;}}}}
public static void Entrada11(int[][] M, int f, int c)
{
int n=f;
int n2=f;
int con;
int s;
con=0;
s=0;
int j,i,k;
int[][] Mat = new int[n + 1][n + 1];
for (i=0;i<=n;i++)
{
for (j=0;j<=n;j++)
{
s=s+1;
// Mat[i][j]=s;
}
}
s=0;
for (j=1; j<=n; j++)
{
System.out.print("\n");
//cout<<"\n"<<c;
if (con==n)
{
// k=k+1;
//k=i;
//cout<<"c="<<c<<"n"<<n<<"i"<<i<<"="<<mat[0][1];
for (k=n; k>=1; k--)
{
s=s+1;
Mat[k][j]=s;
//origen[s];
con=con+1;
System.out.print("\t" + Mat[k][j]);
//cout<<"\t"<<mat[i][j];
}
con=con-n;
}
if (con==0)
{
;
for (i=1; i<=n; i++)
{
s=s+1;
Mat[i][j]=s;
con=con+1;
System.out.print("\t" + Mat[i][j]);
//cout<<"\t"<<mat[i][j];
}}}}
}
Codigo en C++
#include <stdio.h>
#define n 8
void Entrada1(int mat[][n]);
void Entrada2(int mat[][n]);
void Entrada3(int mat[][n]);
void Entrada5(int mat[][n]);
void Entrada6(int mat[][n]);
void Entrada7(int mat[][n]);
void Entrada8(int mat[][n]);
void Espiral(int mat[][n]);
int main() {
int mat[n][n];
Espiral(mat);
Entrada1(mat);
Entrada2(mat);
Entrada3(mat);
Entrada5(mat);
Entrada6(mat);
Entrada7(mat);
Entrada8(mat);
return 0;
}
void Entrada1(int mat[][n]) {printf("\t\t\tESPIRAL Entrada N° 1\n ");int i,j;printf("\n");for(i = 0; i < n; i++) {for(j = 0; j < n; j++) {printf("%4d", mat[i][j]);}printf("\n");}}
void Entrada2(int mat[][n]){printf("\t\t\tESPIRAL Entrada N° 2\n ");int i,j;printf("\n");for(i = n-1; i>=0; i--) {for(j = 0; j < n; j++) {printf("%4d", mat[i][j]);}printf("\n");}}
void Entrada3(int mat[][n]){printf("\t\t\tESPIRAL Entrada N° 3\n ");int i,j;printf("\n");for(i = n-1; i>=0; i--) {for(j=n-1; j>=0; j--) {printf("%4d", mat[i][j]);}printf("\n");}}
void Entrada5(int mat[][n]){printf("\t\t\tESPIRAL Entrada N° 5\n ");int i,j;printf("\n");for (j=0; j<=n-1; j++){for (i=n-1; i>=0; i--){printf("%4d", mat[i][j]);}printf("\n");}}
void Entrada6(int mat[][n]){printf("\t\t\tESPIRAL Entrada N° 6\n ");int i,j;printf("\n");for(i=0; i<=n-1; i++) {for(j=n-1; j>=0; j--) {printf("%4d", mat[i][j]);}printf("\n");}}
void Entrada7(int mat[][n]){printf("\t\t\tESPIRAL Entrada N° 7\n ");int i,j;printf("\n");for (j=n-1; j>=0; j--){for (i=n-1; i>=0; i--) {printf("%4d", mat[i][j]);}printf("\n");}}
void Entrada8(int mat[][n]){printf("\t\t\tESPIRAL Entrada N° 8\n ");int i,j,c,s,k;printf("\n");c=0;s=0;for (j=0; j<=n-1; j++){if (c==n){for (k=0; k<=n-1; k++){printf("%4d", mat[i][j]);}
printf("\n");c=c-n;}if (c==0){for (i=0; i<=n-1; i++){printf("%4d", mat[i][j]);}printf("\n");}}}
void Espiral(int mat[][n]) {
int i, j;
int s = 1;
int tem = n-1;
for(i = 1; i < n; i++)
{
for(j = i-1; j < tem; j++) {mat[n-(tem+1)][j] = s;s++;}
for( j = i-1; j < tem; j++) {mat[j][tem] = s;s++;}
for(j = tem; j >= (i-1); j--) {mat[tem][j] = s;s++;}tem--;
for(j = tem; j >= i; j--) {mat[j][n-(tem+2)] = s;s++;}
}
}
#include <stdio.h>
#define MAX 6 /* Define la dimension maxima de la matriz */
void show(int matrix[][MAX]);
void llenar_esperilicamente(int matrix[][MAX]);
int main(int argc, char *argv[]) {
int matrix[MAX][MAX];
llenar_esperilicamente(matrix);
show(matrix);
return 0;
}
void show(int matrix[][MAX]) {
/* imprime la matriz recibida por parametro en la pantalla */
int i,j;
for(i = 0; i < MAX; i++) {
for(j = 0; j < MAX; j++) {
printf("%4d", matrix[i][j]);
}
printf("\n");
}
}
void llenar_esperilicamente(int matrix[][MAX]) {
/* Llena la matriz recibida por parametro en forma de espiral */
int i, j;
int count = 1;
int aux = MAX-1;
for(i = 1; i < MAX; i++) {
for(j = i-1; j < aux; j++) {
matrix[MAX-(aux+1)][j] = count;
count++;
}
for( j = i-1; j < aux; j++) {
matrix[j][aux] = count;
count++;
}
for(j = aux; j >= (i-1); j--) {
matrix[aux][j] = count;
count++;
}
aux--;
for(j = aux; j >= i; j--) {
matrix[j][MAX-(aux+2)] = count;
count++;
}
}
}
ROTAR
#include <stdio.h>
#define MAX 3 /* Define la dimensión de la matriz */
void rotar(int matrix[][MAX]);
void show(int matrix[][MAX]);
void revez(int matriz[][MAX]) ;
int main(int argc,char *argv[])
{
int matrix[MAX][MAX];
int x,i,j;
for(i=0;i<MAX;i++){
for(j=0;j<MAX;j++){
printf("Valor %dx%d: ", i,j);
scanf("%d", &x);
matrix[i][j]=x;
}
}
printf("Matriz original:");
show(matrix);
rotar(matrix);
printf("Matriz rotada:");
show(matrix);
return 0;
}
void rotar(int matrix[MAX][MAX])
{
int i,j,aux;
for(i=0;i<MAX;i++){
for(j=0;j<=i;j++){
aux=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=aux;
}
}
for(i=0;i<MAX;i++) {
for(j=0;j<MAX/2;j++) {
aux=matrix[i][j];
matrix[i][j]=matrix[i][MAX-j-1];
matrix[i][MAX-j-1]=aux;
}
}
}
void show(int matrix[][MAX]){
int i,j;
printf("\n");
for(i=0;i<MAX;i++){
for(j=0;j<MAX;j++){
printf("%4d", matrix[i][j]);
}
printf("\n");
}
}
No hay comentarios:
Publicar un comentario