Wielomiany

/* SchematHornera.java 

w(x) = 1 + 2x + 3x^2 + 4x^3

w(x) = 1 + x(2 + 3x + 4x^2)
w(x) = 1 + x(2 + x(3 + 4x))
w(x) = 1 + x(2 + x(3 + x4))

s0 = 4
s1 = 3 + x * s0
s2 = 2 + x * s1
s3 = 1 + x * s2
*/

public class SchematHornera
{
  public static void main(String[] args)
  {
    double[] a = {1,2,3,4}; // 1 + 2x + 3x^2 + 4x^3
    double x = 0.5;
    
    double suma = a[a.length - 1];
    
    for (int i = a.length - 2; i >= 0; i--)
    {
      suma = a[i] + x*suma;
    }
    
    System.out.println("w(" + x + ") = " + suma);
  }
}
w(0.5) = 3.25
Press any key to continue...

Zadanie Dokonaj analizy programu SchematHornera.

a = {1.0,2.0,3.0,4.0}
x = 0.5

suma = a[4 - 1] = a[3] = 4.0

i = 2
2 >= 0    suma = a[2] + 0.5*4.0 = 3.0 + 2.0 = 5.0    i = 1
1 >= 0    suma = a[1] + 0.5*5.0 = 2.0 + 2.5 = 4.5    i = 0
0 >= 0    suma = a[0] + 0.5*4.5 = 1.0 + 2.25 = 3.25  i = -1
-1 >= 0   false

"w(0.5) = 3.25"
/* SumaWielomianow.java 

  1 + 2x + 3x^2
+ 2 + 4x
---------------
  3 + 6x + 3x^2
*/

public class SumaWielomianow
{
  public static void main(String[] args)
  {
    double[] w1 = {1, 2, 3}; // 1 + 2x + 3x^2
    double[] w2 = {2, 4};    // 2 + 4x
    
    double[] suma = suma(w1, w2); // 3 + 6x + 3x^2
    
    for (int i = 0; i < suma.length; i++)
      System.out.print(suma[i] + " ");

    System.out.println();
  }

  static double[] suma(double[] w1, double[] w2)
  {
    int max = Math.max(w1.length, w2.length);

    double[] suma = new double[max];

    for (int i = 0; i < max; i++)
    {
      double wsp1 = i < w1.length ? w1[i] : 0;
      double wsp2 = i < w2.length ? w2[i] : 0;

      suma[i] = wsp1 + wsp2;
    }

    return suma;
  }
}
3.0 6.0 3.0
Press any key to continue...

Zadanie Dokonaj analizy programu SumaWielomianow.

w1 = {1.0, 2.0, 3.0}
w2 = {2.0, 4.0}

suma = suma(w1, w2) = {3.0, 6.0, 3.0}

* suma(w1, w2) = {3.0, 6.0, 3.0}

  max = max(3,2) = 3

  suma = {0.0, 0.0, 0.0}

  i = 0
  0 < 3    wsp1 = (0 < 3 ? w1[0] : 0) = 1.0
           wsp2 = (0 < 2 ? w2[0] : 0) = 2.0

           suma[0] = 1.0 + 2.0 = 3.0
  i = 1
  1 < 3    wsp1 = (1 < 3 ? w1[1] : 0) = 2.0
           wsp2 = (1 < 2 ? w2[1] : 0) = 4.0

           suma[1] = 2.0 + 4.0 = 6.0
  i = 2
  2 < 3    wsp1 = (2 < 3 ? w1[2] : 0) = 3.0
           wsp2 = (2 < 2 ? w2[2] : 0) = 0.0

           suma[2] = 3.0 + 0.0 = 3.0
  i = 3
  3 < 3    false

  return suma = {3.0, 6.0, 3.0}

i = 0
0 < 3    '3.0 '    i = 1
1 < 3    '6.0 '    i = 2
2 < 3    '3.0 '    i = 3
3 < 3    false

""
/* IloczynWielomianow.java 

 i                 j
(1 + 2x + 3x^2) * (2 + 4x) =

 1*2 + 1*4x +
       2*2x + 2*4x^2 +
              3*2x^2 + 3*4x^3 =

 2   + 8x   + 14x^2  + 12x^3
*/

public class IloczynWielomianow
{
  public static void main(String[] args)
  {
    double[] w1 = {1, 2, 3}; // 1 + 2x + 3x^2
    double[] w2 = {2, 4};    // 2 + 4x

    double[] iloczyn = iloczyn(w1, w2); // 2 + 8x + 14x^2 + 12x^3

    for (int i = 0; i < iloczyn.length; i++)
      System.out.print(iloczyn[i] + " ");

    System.out.println();
  }

  static double[] iloczyn(double[] w1, double[] w2)
  {
    int st = w1.length + w2.length - 1;
    
    double[] iloczyn = new double[st];
    
    for (int i = 0; i < w1.length; i++)
    {
      for (int j = 0; j < w2.length; j++)
      {
        iloczyn[i+j] = iloczyn[i+j] + w1[i]*w2[j];
      }
    }
    
    return iloczyn;
  }
}
2.0 8.0 14.0 12.0
Press any key to continue...

Zadanie Dokonaj analizy programu IloczynWielomianow.

w1 = {1.0, 2.0, 3.0}
w2 = {2.0, 4.0}

iloczyn = iloczyn(w1, w2) = {2.0, 8.0, 14.0, 12.0}

* iloczyn(w1, w2) = {2.0, 8.0, 14.0, 12.0}

  st = 3 + 2 - 1 = 4

  iloczyn = {0.0, 0.0, 0.0, 0.0}

  i = 0
  0 < 3    j = 0
           0 < 2    iloczyn[0+0] = iloczyn[0] + w1[0]*w2[0] = 0.0 + 1.0*2.0 = 2.0    j = 1
           1 < 2    iloczyn[0+1] = iloczyn[1] + w1[0]*w2[1] = 0.0 + 1.0*4.0 = 4.0    j = 2
           2 < 2    false
  i = 1
  1 < 3    j = 0
           0 < 2    iloczyn[1+0] = iloczyn[1] + w1[1]*w2[0] = 4.0 + 2.0*2.0 = 8.0    j = 1
           1 < 2    iloczyn[1+1] = iloczyn[2] + w1[1]*w2[1] = 0.0 + 2.0*4.0 = 8.0    j = 2
           2 < 2    false
  i = 2
  2 < 3    j = 0
           0 < 2    iloczyn[2+0] = iloczyn[2] + w1[2]*w2[0] = 8.0 + 3.0*2.0 = 14.0   j = 1
           1 < 2    iloczyn[2+1] = iloczyn[3] + w1[2]*w2[1] = 0.0 + 3.0*4.0 = 12.0   j = 2
           2 < 2    false
  i = 3
  3 < 3   false
  
  return iloczyn = {2.0, 8.0, 14.0, 12.0}

i = 0
0 < 4    '2.0 '    i = 1
1 < 4    '8.0 '    i = 2
2 < 4    '14.0 '   i = 3
3 < 4    '12.0 '   i = 4
4 < 4    false

""
/* IlorazWielomianow.java 

  3x^2 + 0.5x + 1.5                    {1.5, 0.5, 3.0}
  ----------------------               ----------------------
  12x^3 + 14x^2 + 8x + 2 : 4x + 4      {2.0, 8.0, 14.0, 12.0} : {4.0, 4.0}
-(12x^3 + 12x^2)                                -(12.0, 12.0)
  ----------------------                         ------------
           2x^2 + 8x + 2               {2.0, 8.0,  2.0,  0.0}
         -(2x^2 + 2x)                      -(2.0,  2.0)
           -------------                    -----------
                  6x + 2               {2.0, 6.0,  0.0,  0.0}
                -(6x + 6)             -(6.0, 6.0)
                  ------               ----------
                     - 4              {-4.0, 0.0,  0.0,  0.0}
*/

public class IlorazWielomianow
{
  public static void main(String[] args)
  {
    double[] w1 = {2.0, 8.0, 14.0, 12.0}; // 2 + 8x + 14x^2 + 12x^3
    double[] w2 = {4.0, 4.0}; // 4 + 4x
    
    double[][] wynik = iloraz(w1, w2); // 1.5 + 0.5x + 3x^2, -4
    
    double[] iloraz = wynik[0];
    double[] reszta = wynik[1];
    
    System.out.print("iloraz: ");
    
    for (int j = 0; j < iloraz.length; j++) System.out.print(iloraz[j] + " ");
      
    System.out.println();
    
    System.out.print("reszta: ");
    
    for (int j = 0; j < w2.length - 1; j++) System.out.print(reszta[j] + " ");
    
    System.out.println();
  }
  
  static double[][] iloraz(double[] w1, double[] w2)
  {
    int st = w1.length - w2.length + 1;
    
    double[] iloraz = new double[st];
    double[] reszta = w1.clone();
    
    for (int k = iloraz.length - 1, i = w1.length - 1; k >= 0; k--, i--)
    {
      iloraz[k] = reszta[i] / w2[w2.length-1];
      
      for (int j = w2.length - 1; j >= 0; j--)
      {
        reszta[k + j] = reszta[k + j] - iloraz[k]*w2[j];
      }
    }
    
    return new double[][]{iloraz, reszta};
  }
}
iloraz: 1.5 0.5 3.0
reszta: -4.0
Press any key to continue...

Zadanie Dokonaj analizy programu IlorazWielomianow.

w1 = {2.0, 8.0, 14.0, 12.0}
w2 = {4.0, 4.0}

wynik = iloraz(w1, w2) = {{1.5, 0.5, 3.0}, {-4.0, 0.0, 0.0, 0.0}}

* iloraz(w1, w2) = {{1.5, 0.5, 3.0}, {-4.0, 0.0, 0.0, 0.0}}

  st = 3 - 1 + 1 = 3
  
  iloraz = {0.0, 0.0, 0.0}
  reszta = {2.0, 8.0, 14.0, 12.0}
  
  k = 2
  i = 3
  2 >= 0   iloraz[2] = reszta[3] / w2[1] = 12.0 / 4.0 = 3.0   // {0.0, 0.0, 3.0}
  
           j = 1   
           1 >= 0   reszta[2 + 1] = reszta[3] - iloraz[2]*w2[1] = 12.0 - 3.0*4.0 = 0.0   j = 0   // {2.0, 8.0, 14.0, 0.0}
           0 >= 0   reszta[2 + 0] = reszta[2] - iloraz[2]*w2[0] = 14.0 - 3.0*4.0 = 2.0   j = -1  // {2.0, 8.0,  2.0, 0.0}
          -1 >= 0   false
  k = 1
  i = 2
  1 >= 0   iloraz[1] = reszta[2] / w2[1] = 2.0 / 4.0 = 0.5   // {0.0, 0.5, 3.0}

           j = 1
           1 >= 0   reszta[1 + 1] = reszta[2] - iloraz[1]*w2[1] = 2.0 - 0.5*4.0 = 0.0   j = 0   // {2.0, 8.0, 0.0, 0.0}
           0 >= 0   reszta[1 + 0] = reszta[1] - iloraz[1]*w2[0] = 8.0 - 0.5*4.0 = 6.0   j = -1  // {2.0, 6.0, 0.0, 0.0}
          -1 >= 0   false
  k = 0
  i = 1
  0 >= 0   iloraz[0] = reszta[1] / w2[1] = 6.0 / 4.0 = 1.5   // {1.5, 0.5, 3.0}
  
           j = 1
           1 >= 0   reszta[0 + 1] = reszta[1] - iloraz[0]*w2[1] = 6.0 - 1.5*4.0 = 0.0   j = 0   // {2.0, 0.0, 0.0, 0.0}
           0 >= 0   reszta[0 + 0] = reszta[0] - iloraz[0]*w2[0] = 2.0 - 1.5*4.0 = -4.0  j = -1  // {-4.0, 0.0, 0.0, 0.0}
          -1 >= 0   false
          
  return {{1.5, 0.5, 3.0}, {-4.0, 0.0, 0.0, 0.0}}
  
iloraz = wynik[0] = {1.5, 0.5, 3.0}
reszta = wynik[1] = {-4.0, 0.0, 0.0, 0.0}

"iloraz: 1.5 0.5 3.0"
"reszta: -4.0"

Strona główna