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();