32 votos

Encontrar entero de soluciones para la ecuación trigonométrica de $8\sin^2\left(\frac{(k+1)\pi}{n}\right)=n\sin\left(\frac{2\pi}{n}\right)$

Pensé que el problema de encontrar un regular $$n de lados del polígono que tiene una diagonal con longitud $d_k$ tal que el área del polígono es igual a ${d_k}^2$. Haciendo fácil la trigonometría dentro del polígono tengo la ecuación $$8\sin^2\left(\frac{(k+1)\pi}{n}\right)=n\sin\left(\frac{2\pi}{n}\right).$$ Donde $d_k$ es la longitud de la diagonal que se salta $k$ vértices. (Por lo que $d_0$ es simplemente la longitud de un lado.)

He comprobado que algunos de los valores de $n$ y parece que $(4,0)$ y $(12,3)$ son los únicos (primitivo y no trivial) los posibles valores de $(n,k)$.

Pero, ¿cómo puedo comprobar si esto es cierto?

Un enfoque consiste en reescribir la ecuación usando $\sin(x)=\frac i2(e^{-ix}-e^{ix})$. Esto le da $$4t^{2k+2}-int^{k+2}-8t^{k+1}+int^k+4=0,$$ donde lo puse $t=e^{\frac{2\pi i}n}$ para mayor claridad.

3voto

Al C Puntos 1194

(4,0) y (12,3) son los únicos "primitivo y no-trivial de" soluciones de $(n,k)$ con $n\leq 10^5$.

Teniendo en cuenta las simetrías que están presentes tanto en su geometría de la pregunta y en la ecuación resultante, vamos un "primitivo y no-trivial de" solución de estar un par de $(n,k)$ con $n,k\in \mathbb{Z}$, $n\geq 3$, y $0\leq k \leq n/2 - 1$, satisfaciendo$$8\sin^2\left(\frac{(k+1)\pi}{n}\right)=n\sin\left(\frac{2\pi}{n}\right).$$ El hecho de que $k$ puede ser restringido a un número finito de intervalos para cada $n$ se abre el problema para un numérica directa de búsqueda. Aquí está mi aplicación en PARI/GP:

N_MIN=3;
N_MAX=100000;
N_BLOCKSIZE=100;
TOLERANCE=1e-20;

\\ We express the problem in terms of m,n, where m=k+1.
\\ We only call the (slow) sin function once for each computation of the LHS.
lhs(m,n)={sqrt_lhs=sin(m*Pi/n); sqrt_lhs*sqrt_lhs;}
rhs(n)=sin(2*Pi/n)*n/8;

\\ Check m,n for |LHS-RHS| < TOLERANCE
for(n=N_MIN,N_MAX,cur_rhs=rhs(n); if(n%N_BLOCKSIZE==0,printf("# Done checking all n<%u\n", n)); for(m=1,n/2,{
    cur_lhs=lhs(m,n);
    if(abs(cur_lhs-cur_rhs)<TOLERANCE, printf("%u\t%u\t%e\n", n, m-1, cur_lhs-cur_rhs))
    }));
quit

Nota: Si no me equivoco, esto está garantizado para encontrar todas las soluciones de dólares(m,n)$ con $n<n_\max = 10^5$, aunque aritmética de punto flotante se utiliza (suponiendo que no existen errores en PARI/GP o mi pc). El punto es que PARI/GP de reclamaciones de una precisión predeterminada de 38 dígitos decimales, mientras que la tolerancia de la raíz encontrar en el código de arriba es la equivalencia a 20 dígitos decimales. Si se calcula la propagación de errores, asumiendo 38 dígitos de precisión para el pecado funciones, el error absoluto máximo después de los pocos operaciones aritméticas por $n,m$ par todavía está en el orden de $10^{-38}$. El código, en principio, puede dar falsos positivos si el lado derecho y el lado izquierdo no son iguales pero se encuentren dentro de la tolerancia de uno a otro, pero que no puede dar falsos negativos. (De hecho, para estos parámetros no hubo falsos positivos).


Actualización: Aquí es una implementación en C utilizando 128 bits aritmética de punto flotante:

#include <stdio.h>
#include <quadmath.h>

// To compile: gcc -O3 -std=c99 -lquadmath trig.c -o trig

#define M_2PIq 6.2831853071795864769252867665590058q

#define N_MIN 3
#define N_MAX 2000
#define N_BLOCKSIZE 100
#define TOLERANCE 1e-20q
#define DIGITS 35

int main(){

  // We express the problem in terms of m,n, where m=k+1.
  for(unsigned n=N_MIN; n<=N_MAX; n++){

    // Print out a status update each N_BLOCKSIZE iterations.
    if(n%N_BLOCKSIZE==0) printf("# Done checking all n<%u\n", n);

    // Compute the RHS only once per n
    __float128 cur_rhs = sinq(M_2PIq/n)*n/8.0q;
    for(unsigned m=1; 2*m<=n; m++){

      // We only call the (slow) sin function once for each computation of the LHS.
      __float128 cur_lhs=sinq(m*M_PIq/n);
      cur_lhs*=cur_lhs;

      // Print out (n,k) if a solution is found
      if( fabsq(cur_lhs-cur_rhs) < TOLERANCE ){
        char str_difference[DIGITS];
        quadmath_snprintf(str_difference, DIGITS, "%Qe", fabsq(cur_lhs-cur_rhs));
        printf("%u\t%u\t%s\n", n, m-1, str_difference); 
      }
    }
  }

}

3voto

Constructor Puntos 1025

Pequeño comentario: es claro que si el par $(n,k)$ con $0\le k<\left\lfloor\frac{n}{2}\right\rfloor$ satisface la igualdad, a continuación, pares $(n, k+nt)$ y $(n, n-2-k+nt)$ satisfacer (donde $t\in\mathbb{Z^+}$).

Como @Pedro Košinár señaló que esta igualdad es equivalente a $$4\cos\left(\frac{2\pi(k+1)}{n}\right)+n\sin\left(\frac{2\pi}{n}\right)=4$$ así, por conocido $n$ el valor de $k$ se puede encontrar como $$k=\frac{n}{2\pi}\arccos\left(1−\frac{n}{4}\sin \frac{2\pi}{n}\right)-1$$ Si $\frac{n}{2\pi}\arccos\left(1−\frac{n}{4}\sin \frac{2\pi}{n}\right)$ es un número entero, a continuación, una pareja adecuada se encuentra.

El sencillo programa escrito en C++ (que utiliza el tipo de long double para los cálculos) da los siguientes pares $(n,k)$ para $n\le 10^9$:

         n         k
         4         0
        12         3
 104758793  36318061
 211160884  73205826
 211708650  73395727
 317015209 109903690
 423417300 146791455
 423965066 146981356
 634030418 219807381
 742623573 257454750
 846286834 293393010
 846834600 293582911
 847382366 293772812
 847930132 293962713
 848477898 294152614
 952688925 330280775
 953236691 330470676
 953784457 330660577
 954332223 330850478
 954879989 331040379

Es una consecuencia de los errores de cálculos numéricos o no? No sé.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X