Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Assignment 10: import java.util.Scanner; import java.math.BigDecimal; import jav

ID: 3914425 • Letter: A

Question

Assignment 10:

import java.util.Scanner;

import java.math.BigDecimal;

import java.math.RoundingMode;

public class Complex {

// double real;

// double imaginary;

BigDecimal real, imaginary;

public Complex(BigDecimal real, BigDecimal imaginary) {

this.real = real;

this.imaginary = imaginary;

}

public String toString(){

if(this.real.equals(BigDecimal.ZERO)){

return this.imaginary + "i";

} else if (this.imaginary.equals(BigDecimal.ZERO)){

return this.real + "" ;

} else if(this.imaginary.compareTo(BigDecimal.ZERO) < 0){

return "(" + this.real + " - " + imaginary.abs() + "i" + ")";

}

return "(" + this.real + " + " + imaginary.abs() + "i" + ")";

}

public static Complex add(Complex num1 , Complex num2){

return new Complex(num1.real.add(num2.real), num1.imaginary.add(num2.imaginary));

}

public static Complex subtract(Complex num1, Complex num2){

return new Complex(num1.real.subtract(num2.real), num1.imaginary.subtract(num2.imaginary));

}

public static Complex multiply(Complex num1, Complex num2){

Complex temp = new Complex(BigDecimal.ZERO, BigDecimal.ZERO);

//(a + bi) * ( c + di) = ( ac - bd ) + (ad + bc )i

temp.real = (num1.real.multiply(num2.real) ).subtract((num1.imaginary.multiply(num2.imaginary)) );

temp.imaginary = (num1.real.multiply(num2.imaginary)).add((num2.real.multiply(num1.imaginary)) );

return temp;

}

public static Complex divide(Complex num1, Complex num2){

BigDecimal temp = (num2.real.multiply( num2.real)).add((num2.imaginary.multiply(num2.imaginary)));

if (temp.equals(BigDecimal.ZERO))

return new Complex(null, null);

// return new Complex(((num1.real * num2.real) + (num1.imaginary * num2.imaginary)) / temp,

// ((num1.imaginary * num2.real) - (num1.real * num2.imaginary)) / temp);

return new Complex(((num1.real.multiply(num2.real)).add((num1.imaginary.multiply(num2.imaginary)))).divide(temp,2, RoundingMode.HALF_UP),

((num1.imaginary.multiply(num2.real)).subtract(num1.real.multiply(num2.imaginary))).divide(temp,2, RoundingMode.HALF_UP));

// return new Complex(BigDecimal.ZERO, BigDecimal.ZERO);

}

public static boolean testForEquality(Complex num1, Complex num2){

if(num1.real.equals(num2.real) && num1.imaginary.equals(num2.imaginary)){

return true;

}

return false;

}

public static void main(String[] args) {

Scanner reader = new Scanner(System.in);

// double real;

// double imaginary;

BigDecimal real, imaginary;

System.out.print("Enter first real part: ");

// real = Double.parseDouble(reader.nextLine());

real = reader.nextBigDecimal() ;

System.out.print("Enter first imaginary part: ");

// imaginary = Double.parseDouble(reader.nextLine());

imaginary = reader.nextBigDecimal() ;

Complex num1 = new Complex(real,imaginary);

System.out.println("1st Number Is : "+num1);

System.out.print("Enter second real part: ");

// real = Double.parseDouble(reader.nextLine());

real = reader.nextBigDecimal() ;

System.out.print("Enter second imaginary part: ");

// imaginary = Double.parseDouble(reader.nextLine());

imaginary = reader.nextBigDecimal() ;

// Complex num2 = new Complex(real,imaginary);

Complex num2 = new Complex(real,imaginary);

System.out.println("2nd Number Is : "+num2);

System.out.println(" Performing arithmetic operations .... ");

System.out.println(num1 + " + " + num2 + " = " + add(num1,num2));

System.out.println(num1 + " - " + num2 + " = " + subtract(num1,num2));

System.out.println(num1 + " * " + num2 + " = " + multiply(num1,num2));

System.out.println(num1 + " / " + num2 + " = " + divide(num1,num2));

if(testForEquality(num1,num2)){

System.out.println(num1 + " = " + num2);

} else {

System.out.println(num1 + " != " + num2);

}

}

}

// Assume a and b are BigDecimal then -->>

// a+b --> a.add(b);

// a-b --> a.subtract(b);

// a*b --> a.multiply(b);

// a/b --> a.divide(b,k,RoundingMode.HALF_UP); where k is precision and RoundingMode.HALF_UP is rounding mode

// abs(a) --> a.abs();

Assigment 11:

Reconfigure the class from assignment 10 to use Fractions as the values for the real and imaginary parts of the complex numbers. which is the given code above^

Sample Session:

Please enter the first complex number, real numerator>-1

Please enter the first complex number, real denominator>2

Please enter the first complex number, imaginary numerator> 1

Please enter the first complex number, imaginary denominator> -3 (-1/2 - 1/3i)

Please enter the second complex number, real numerator> 2

Please enter the second complex number, real denominator > 2

Please enter the second complex number, imaginary numerator> 5

Please enter the second complex number, imaginary denominator > -2 (1- 2 1/2i)

(-1/2 - 1/3i) + (1 - 2 1/2i) = (1/2 - 2 5/6i)

(-1/2 - 1/3i) - (1 - 2 1/2i) = (-1 1/2 + 2 1/6i)

(-1/2 - 1/3i) * (1 - 2 1/2i) = (-1 1/3 + 11/12i)

(-1/2 - 1/3i) / (1 - 2 1/2i) = (4/87 - 19/87i)

Please enter the first complex number, real numerator> 1

Please enter the first complex number, real denominator> 1

Please enter the first complex number, imaginary numerator > 5

Please enter the first complex number, imaginary denominator > 2 (1+2 1/2i)

Please enter the second complex number, real numerator > 0

Please enter the second complex number, real denominator > 1

Please enter the second complex number, imaginary numerator> 0

Please enter the second complex number, imaginary denominator > 1 0

(1 +2 1/2i) + 0= (1 + 2 1/2i)

(1 + 2 1/2i) - 0 = (1 + 2 1/2i)

(1 + 2 1/2i) * 0= 0

(1 + 2 1/2i) / 0 = ERROR

(1 + 2 1/2i) !=0

Explanation / Answer

import java.util.Scanner;
import java.math.BigDecimal;
import java.math.RoundingMode;

public class Complex {

   // double real;
   // double imaginary;
   BigDecimal realNumerator,realDenominator,imaginaryNumerator,imaginaryDenominator;
   public Complex(BigDecimal realNumerator,BigDecimal realDenominator,BigDecimal imaginaryNumerator,BigDecimal imaginaryDenominator) {
       this.realNumerator = realNumerator;
       this.realDenominator = realDenominator;
       this.imaginaryNumerator = imaginaryNumerator;
       this.imaginaryDenominator = imaginaryDenominator;
   }

   public String toString(){
       if(this.realNumerator.equals(BigDecimal.ZERO)){
           return this.imaginaryNumerator+"/"+this.imaginaryDenominator + "i";
       } else if (this.imaginaryNumerator.equals(BigDecimal.ZERO)){
           return this.realNumerator+"/"+this.realDenominator+"" ;
       } else if(this.imaginaryNumerator.compareTo(BigDecimal.ZERO) < 0){
           return "(" + this.realNumerator+"/"+this.realDenominator+ " - " + imaginaryNumerator.abs()+"/"+this.imaginaryDenominator+ "i" + ")";
       }
       return "(" + this.realNumerator+"/"+this.realDenominator + " + " + imaginaryNumerator.abs()+"/"+this.imaginaryDenominator + "i" + ")";
   }
  
   //Finding lcm b/w denominators
   static BigDecimal LCM(BigDecimal n1,BigDecimal n2){
       BigDecimal lcm;
       if(n1.compareTo(n2)==1)
           lcm=n1;
       else
           lcm=n2;
       while(true){
           if(BigDecimal.ZERO.compareTo(lcm.remainder(n1))==0&&BigDecimal.ZERO.compareTo(lcm.remainder(n2))==0)
               break;
           lcm=lcm.add(new BigDecimal(1));
       }
       return lcm;
   }
  
   //addition of complex numbers
   public static Complex add(Complex num1 , Complex num2){
       BigDecimal lcmreal,lcmimaginary,part1,part2;
       lcmreal=LCM(num1.realDenominator,num2.realDenominator);
       lcmimaginary=LCM(num1.imaginaryDenominator,num2.imaginaryDenominator);
       part1=(lcmreal.divide(num1.realDenominator,0,RoundingMode.HALF_UP)).multiply(num1.realNumerator).add((lcmreal.divide(num2.realDenominator,0,RoundingMode.HALF_UP)).multiply(num2.realNumerator));
       part2=(lcmimaginary.divide(num1.imaginaryDenominator,0,RoundingMode.HALF_UP)).multiply(num1.imaginaryNumerator).add((lcmimaginary.divide(num2.imaginaryDenominator,0,RoundingMode.HALF_UP)).multiply(num2.imaginaryNumerator));
       return new Complex(part1,lcmreal,part2,lcmimaginary);
   }
  
   //subtraction of complex numbers
   public static Complex subtract(Complex num1, Complex num2){
       BigDecimal lcmreal,lcmimaginary,part1,part2;
       lcmreal=LCM(num1.realDenominator,num2.realDenominator);
       lcmimaginary=LCM(num1.imaginaryDenominator,num2.imaginaryDenominator);
       part1=((lcmreal.divide(num1.realDenominator,0,RoundingMode.HALF_UP)).multiply(num1.realNumerator)).subtract((lcmreal.divide(num2.realDenominator,0,RoundingMode.HALF_UP)).multiply(num2.realNumerator));
       part2=((lcmimaginary.divide(num1.imaginaryDenominator,0,RoundingMode.HALF_UP)).multiply(num1.imaginaryNumerator)).subtract((lcmimaginary.divide(num2.imaginaryDenominator,0,RoundingMode.HALF_UP)).multiply(num2.imaginaryNumerator));
       return new Complex(part1,lcmreal,part2,lcmimaginary);
   }

   //multiplication of complex numbers
   public static Complex multiply(Complex num1, Complex num2){
       Complex temp = new Complex(BigDecimal.ZERO, BigDecimal.ZERO,BigDecimal.ZERO, BigDecimal.ZERO);
       //(a + bi) * ( c + di) = ( ac - bd ) + (ad + bc )i
       BigDecimal lcmreal,x,y,z,t,rnum,rdenom,inum,idenom;
       x=num1.realDenominator.multiply(num2.realDenominator);
       y=num1.imaginaryDenominator.multiply(num2.imaginaryDenominator);
       lcmreal=LCM(x,y);
       z=num1.realNumerator.multiply(num2.realNumerator);
       t=num1.imaginaryNumerator.multiply(num2.imaginaryNumerator);
       temp.realNumerator=(z.multiply(lcmreal.divide(x,0,RoundingMode.HALF_UP))).subtract(t.multiply(lcmreal.divide(y,0,RoundingMode.HALF_UP)));
       temp.realDenominator=lcmreal;
       x = num1.imaginaryDenominator.multiply(num2.realDenominator);
       y = num1.realDenominator.multiply(num2.imaginaryDenominator);
       lcmreal=LCM(x,y);
       z = num1.imaginaryNumerator.multiply(num2.realNumerator);
       t = num1.realNumerator.multiply(num2.imaginaryNumerator);
       temp.imaginaryNumerator =(z.multiply(lcmreal.divide(x,0,RoundingMode.HALF_UP))).add(t.multiply(lcmreal.divide(y,0,RoundingMode.HALF_UP)));
       temp.imaginaryDenominator = lcmreal;
       return temp;
   }

   public static Complex divide(Complex num1, Complex num2){
       BigDecimal r1,r2,r3,r4,rlcm,tempNum;
       r1= num2.realNumerator.multiply(num2.realNumerator);
       r2= num2.imaginaryNumerator.multiply(num2.imaginaryNumerator);
       r3= num2.realDenominator.multiply(num2.realDenominator);
       r4= num2.imaginaryDenominator.multiply(num2.imaginaryDenominator);
       rlcm=LCM(r3,r4);
       tempNum =((rlcm.divide(r3,0,RoundingMode.HALF_UP)).multiply(r1)).add((rlcm.divide(r4,0,RoundingMode.HALF_UP)).multiply(r2));      
       //(num2.realNumerator.multiply(num2.realNumerator)).add((num2.imaginaryNumerator.multiply(num2.imaginaryNumerator)));
       if (tempNum.equals(BigDecimal.ZERO))
           return new Complex(null, null,null,null);
       // return new Complex(((num1.real * num2.real) + (num1.imaginary * num2.imaginary)) / temp,
       // ((num1.imaginary * num2.real) - (num1.real * num2.imaginary)) / temp);      
       Complex t=multiply(num1,new Complex(num2.realNumerator,num2.realDenominator,num2.imaginaryNumerator.negate(),num2.imaginaryDenominator));
       return new Complex(t.realNumerator.multiply(rlcm),t.realDenominator.multiply(tempNum),t.imaginaryNumerator.multiply(rlcm),t.imaginaryDenominator.multiply(tempNum));
   }

   public static boolean testForEquality(Complex num1, Complex num2){
       if(num1.realNumerator.equals(num2.realNumerator) && num1.imaginaryNumerator.equals(num2.imaginaryNumerator)&&num1.realDenominator.equals(num2.realDenominator) && num1.imaginaryDenominator.equals(num2.imaginaryDenominator)){
           return true;
       }
       return false;
   }

   public static void main(String[] args) {
       Scanner reader = new Scanner(System.in);
       // double real;
       // double imaginary;
       BigDecimal realNum,realDenom,imaginaryNum,imaginaryDenom;
       System.out.print("Please enter the first complex number,real numerator> ");
       // real = Double.parseDouble(reader.nextLine());
       realNum = reader.nextBigDecimal() ;
       System.out.print("Please enter the first complex number,real denominator> ");
       // real = Double.parseDouble(reader.nextLine());
       realDenom = reader.nextBigDecimal() ;
       System.out.print("Please enter the first complex number,imaginary numerator>");
       // imaginary = Double.parseDouble(reader.nextLine());
       imaginaryNum = reader.nextBigDecimal() ;
       System.out.print("Please enter the first complex number,real denominator> ");
       // real = Double.parseDouble(reader.nextLine());
       imaginaryDenom = reader.nextBigDecimal() ;
       if(realDenom.compareTo(BigDecimal.ZERO)<0){
           realNum=realNum.negate();
           realDenom=realDenom.negate();
       }
       if(imaginaryDenom.compareTo(BigDecimal.ZERO)<0){
           imaginaryNum=imaginaryNum.negate();
           imaginaryDenom=imaginaryDenom.negate();
       }
       Complex num1 = new Complex(realNum,realDenom,imaginaryNum,imaginaryDenom);
       System.out.println("1st Number Is : "+num1);
       System.out.print("Please enter the second complex number,real numerator> ");
       // real = Double.parseDouble(reader.nextLine());
       realNum = reader.nextBigDecimal() ;
       System.out.print("Please enter the second complex number,real denominator> ");
       // real = Double.parseDouble(reader.nextLine());
       realDenom = reader.nextBigDecimal();
       System.out.print("Please enter the second complex number,imaginary numerator>");
       // imaginary = Double.parseDouble(reader.nextLine());
       imaginaryNum = reader.nextBigDecimal() ;
       System.out.print("Please enter the second complex number,real denominator> ");
       // real = Double.parseDouble(reader.nextLine());
       imaginaryDenom = reader.nextBigDecimal() ;
       if(realDenom.compareTo(BigDecimal.ZERO)<0){
           realNum=realNum.negate();
           realDenom=realDenom.negate();
       }
       if(imaginaryDenom.compareTo(BigDecimal.ZERO)<0){
           imaginaryNum=imaginaryNum.negate();
           imaginaryDenom=imaginaryDenom.negate();
       }
       Complex num2 = new Complex(realNum,realDenom,imaginaryNum,imaginaryDenom);
       System.out.println("2nd Number Is : "+num2);
       System.out.println(" Performing arithmetic operations .... ");
       System.out.println(num1 + " + " + num2 + " = " + add(num1,num2));
       System.out.println(num1 + " - " + num2 + " = " + subtract(num1,num2));
       System.out.println(num1 + " * " + num2 + " = " + multiply(num1,num2));
       System.out.println(num1 + " / " + num2 + " = " + divide(num1,num2));
       if(testForEquality(num1,num2)){
           System.out.println(num1 + " = " + num2);
       }
       else {
           System.out.println(num1 + " != " + num2);
       }
   }
}

// Assume a and b are BigDecimal then -->>

// a+b --> a.add(b);

// a-b --> a.subtract(b);

// a*b --> a.multiply(b);

// a/b --> a.divide(b,k,RoundingMode.HALF_UP); where k is precision and RoundingMode.HALF_UP is rounding mode

// abs(a) --> a.abs();