In fact its doubt becomes more a mathematical concept than a programming concept. To work with complex powers use the trigonometric form or the Euler form. There is no need to worry about the value of "i", since there is, in mathematics itself, notation that does not use it, as (real, imaginary), notation that treats the number as an ordered pair of the complex plane. The "i" is a representation that separates the real part from the complex, does not need to be worked.
Code: (response to (a + b * i) n)
Comments on the code explain it (assuming n real):
#include <stdio.h>
#include <math.h>
#define PI 3.1415926535
/* Estrutura para forma complexa cartesiana */
typedef struct complexCart {
double real;
double imaginario;
} ComplexCart;
/* Estrutura para forma complexa trigonométrica */
typedef struct complexTrig {
double raio;
double angulo;
} ComplexTrig;
/* Converte complexo cartesiano para trigonométrico */
ComplexTrig converterTrig(ComplexCart);
/* Converte complexo trigonométrico para cartesiano*/
ComplexCart converterCart(ComplexTrig);
int main(void)
{
/* Variável que irá armazenar a menor potência
necessária. */
double menorPot;
/* Variável "cart" irá guardar número na forma
cartesiana: a + bi, já "trig" na forma trigono-
métrica: r(cos(Angulo) + i sen(Angulo)).
Vale notar que basta trabalhar com os parâmetros
em cada um desses casos, por exemplo, para trabalhar
com dados cartesianos basta (a, b) e trigonométrico sim-
plesmente (r, Angulo) */
ComplexCart cart;
ComplexTrig trig;
printf("\nDigite um número imaginário da forma a + bi: ");
/* Espera receber o número da forma cartesiana.
Ex: -2 + 3i, ou 2 + -3i (imaginária negativa) */
scanf("%lf + %lfi", &cart.real, &cart.imaginario);
/* Converte para forma trigonométrica, essa é mais fácil de lidar
com potências, raízes, divisões e multiplicações. Também poderia
ser utilizada a forma de Euler */
trig = converterTrig(cart);
/* Mostra a forma trigonométrica com o ângulo em radianos: Somente quando
for exibir o resultado se preocupe com a forma de escrita complexa! */
printf("O número em forma trigonométrica (em radianos): z = %.2f(cos(%.2f) + i sen(%.2f))\n",
trig.raio, trig.angulo, trig.angulo);
/* Com o ângulo calcula-se a menor potência necessária
para que a parte do seno zere, ou seja, quando o ângulo é */
menorPot = PI / (trig.angulo) ;
/* Mostra a potência e o ângulo final quando a forma trigonométrica
possui tal ângulo. */
printf("A menor potência para tornar o número somente real é: %.2f\n", menorPot);
printf("Ângulo da forma trigonométrica: %.2f rad\n", (trig.angulo) * menorPot);
/* Reatribui à forma trigonométrica o valor com a potência, ou seja,
a forma já será com o valor elevado à potência */
trig.raio = pow((trig.raio), menorPot);
trig.angulo = (trig.angulo) * menorPot;
/* Converte a forma trigonométrica da potência à forma cartesiana */
cart = converterCart(trig);
/* Mostra o resultado trigonométrico, o seno do ângulo dev ser zero.
Verifique!*/
printf("Forma trigonométrica z^(%.2f) = %.2f(cos(%.2f) + i sen(%.2f))\n",
menorPot, trig.raio, trig.angulo, trig.angulo);
/* Aqui, na fomra cartesiana, por garantia mostra-se a parte imaginária,
que deverá sempre ser zero. */
printf("Forma cartesiana z^(%.2f) = %.2f + %.2f i\n\n", menorPot, cart.real,
cart.imaginario);
return 0;
}
/* Implementações dos Protótipos. */
ComplexTrig converterTrig(ComplexCart dadoCart){
ComplexTrig dadoTrig;
dadoTrig.raio = sqrt( (dadoCart.real) * (dadoCart.real) +
(dadoCart.imaginario) * (dadoCart.imaginario) );
if(dadoCart.real != 0)
dadoTrig.angulo = atan( (dadoCart.imaginario) / (dadoCart.real));
else
dadoTrig.angulo = PI / 2;
return dadoTrig;
}
ComplexCart converterCart(ComplexTrig dadoTrig){
ComplexCart dadoCart;
dadoCart.real = (dadoTrig.raio) * cos(dadoTrig . angulo);
dadoCart.imaginario = (dadoTrig.raio) * sin(dadoTrig.angulo);
return dadoCart;
}
In the above example I used structures to better idealize (and demonstrate union) the complex pair. (It could have been done with 4 independent doubles, but with structure it is easier to visualize). The rest is mathematics. Remember that whenever working with complex numbers is not necessary (most of the time) dealing with the VALUE of i, just work as a usual ordered pair, but subject to certain algebra (I will not comment as it comes out of the scope of the site).
There is the macro
complex
in C and the bundlestd::complex
in C++, which allow this representation in terms of the real and imaginary part. Have you tried using? And by the way, according to the definition, its resulting number will be real if the imaginary part is zero.– Luiz Vieira
I tried to use but could not separate the terms ( Real and imaginary part ) . Exact will be real if the imaginary part is zero. But I can’t encode that . Since I need to figure out what value of n for the imaginary to zero.
– Luis Fernando
Well, then, that’s why your question has already received votes to close. It is unclear whether your doubt is about mathematics (outside the scope of the site) or programming (within the scope of the site). If you’ve tried to use (it doesn’t look like the code you posted), why couldn’t you separate the terms? Where are you going wrong? That is, what is the specific doubt? Edit the question to try to improve it in this sense.
– Luiz Vieira
An example of using the macro in C: http://en.cppreference.com/w/language/arithmetic_types#Complex_floating_types
– Luiz Vieira
is (a + b * i) n? or only i?
– Rafael Bluhm
Probably misunderstood the question...
#include <stdio.h> main(){printf("0\n");}
(OK I’m not helping at all...)– JJoao