Metode Hörner

Metode Hörner dipelajari di sekolah-sekolah sebagai salah satu cara dalam pelakukan pembagian terhadap suatu sukubanyak oleh suatu fungsi. Mengutip dari Wikipedia,
Metode Hörner berkaitan dengan salah satu dari dua hal:
  • algoritma untuk perhitungan terhadap sukubanyak, yang berupa pengubahan bentuk (transformasi) dari deretan suku-suku (monomial) ke bentuk perhitungan (dengan menggunakan bagan/skema) yang lebih efisien; atau 
  • metode untuk menemukan pendekatan terhadap akar-akar dari sukubanyak, yang dikenal sebagai metode Ruffini-Horner.
    Metode ini mengatasnamai matematikawan Inggris, William George Hörner, meskipun hal itu sudah dikenal sebelumnya oleh Paolo Ruffini dan, enam ratus tahun sebelumnya, oleh matematikawan China, Qin Jiushao

    Sukubanyak (Polinomial)

    Pada tulisan ini saya akan mengulas tentang perhitungan di dalam Metode Hörner pada dokumen $\small\LaTeX$ di mana, dengan mencantumkan koefisien-koefisien dari suatu sukubanyak dan pembaginya, kita dapat langsung memperoleh hasil pembagian dan sisanya. Namun, sebelum itu dan seperti telah kita ketahui, karena metode ini berkaitan dengan sukubanyak maka (sebagai acuan) lebih dulu saya tunjukkan dokumen yang memuat konsep sukubanyak berikut ini.




    Dokumen di atas saya susun dalam TeX Live 2015 dengan kelas dokumen (presentasi) Beamer dan bertema Feather dari Lilyana.


    Perhitungan dalam Metode Hörner 

    Perhatikan gambar di samping ini. Barangkali Anda sudah terbiasa melakukan pembagian sukubanyak dengan cara Hörner semacam itu. Kali ini (dalam dokumen $\small\LaTeX$) kita dapat melakukannya tanpa perhitungan secara manual atau coba-coba (try and error). Ini berkat sumbangsih makro dari Egreg, seorang pakar di forum.
    Untuk memudahkan, karena makro tersebut cukup panjang, lebih dulu saya menyimpannya sebagai file horner.tex. Kemudian, dalam struktur dokumen, saya sertakan sebagai input dan menjalankannya dengan paket xparse.
    \ExplSyntaxOn
    \NewDocumentCommand{\horner}{smm}
     {
      \IfBooleanTF{#1}
       { \bool_set_false:N \l_silke_show_bool }
       { \bool_set_true:N \l_silke_show_bool }
      \silke_horner:nn { #2 } { #3 }
     }
    
    \bool_new:N \l_silke_show_bool
    \seq_new:N \l_silke_top_seq
    \seq_new:N \l_silke_middle_seq
    \seq_new:N \l_silke_bottom_seq
    \seq_new:N \l_silke_temp_seq
    \int_new:N \l_silke_degree_int
    \tl_new:N \l_silke_remainder_tl
    
    \cs_new_protected:Npn \silke_horner:nn #1 #2
     {
      \seq_set_split:Nnn \l_silke_top_seq { , } { #1 }
      \int_set:Nn \l_silke_degree_int { \seq_count:N \l_silke_top_seq }
      \seq_clear:N \l_silke_middle_seq
      \seq_clear:N \l_silke_bottom_seq
      \seq_put_right:Nn \l_silke_middle_seq { \downarrow }
      \seq_put_right:Nx \l_silke_bottom_seq
       {
        \int_to_arabic:n { \seq_item:Nn \l_silke_top_seq { 1 } }
       }
      \int_step_inline:nnnn { 2 } { 1 } { \l_silke_degree_int }
       {
        \seq_put_right:Nx \l_silke_middle_seq
         {
          \int_to_arabic:n { \seq_item:Nn \l_silke_bottom_seq { ##1 - 1 } * #2 }
         }
        \seq_put_right:Nx \l_silke_bottom_seq
         {
          \int_to_arabic:n
           {
            \seq_item:Nn \l_silke_top_seq { ##1 }
            +
            \seq_item:Nn \l_silke_middle_seq { ##1 }
           }
         }
       }
      \silke_print_scheme:n { #2 }
     }
    
    \cs_new_protected:Npn \silke_print_scheme:n #1
     {
      \bool_if:NF \l_silke_show_bool
       {
        \silke_phantom:N \l_silke_middle_seq
        \silke_phantom:N \l_silke_bottom_seq
       }
      \seq_pop_right:NN \l_silke_bottom_seq \l_silke_remainder_tl
      \begin{array}{r | *{\l_silke_degree_int}{r} }
         & \seq_use:Nn \l_silke_top_seq { & } \\
      #1 & \seq_use:Nn \l_silke_middle_seq { & } \\
      \hline
         & \seq_use:Nn \l_silke_bottom_seq { & } & 
           \multicolumn{1}{@{\vline width 1pt}r}{\l_silke_remainder_tl}
      \end{array}
     }
    
    \cs_new_protected:Npn \silke_phantom:N #1
     {
      \seq_clear:N \silke_temp_seq
      \seq_map_inline:Nn #1 { \seq_put_right:Nn \silke_temp_seq { \phantom{##1} } }
      \seq_set_eq:NN #1 \silke_temp_seq
     }
    
    \ExplSyntaxOff
    Sebagai contoh, silakan Anda buka dokumen di atas pada frame 9. Untuk memperoleh hasil bagi dan sisa dari pembagian sukubanyak $\small{x^3+2x^2+3x-5}$ oleh $\small{x-2}$, cukup kita nyatakan
    $\horner{1,2,3,-5}{2}$
    Kemudian pada frame 10 kita lakukan pembagian $\small{f(x)=x^4-6x^3-6x^2+8x+6}$ oleh $\small{x-2}$, maka kita tulis
    $\horner{1,-6,-6,8,6}{2}$
    Masih pada frame 10 kita lakukan pembagian $\small{4x^4+3x^2-6x+1}$ oleh $\small{2x-1}$, maka kita tulis
    $\horner{4,0,3,-6,1}{1/2}$
    Namun demikian, untuk diingat, makro tersebut berfungsi hanya jika pembagi dari sukubanyak itu berupa fungsi linear.


    Pengkodean dan Hasilnya

    Berikut ini pengkodean selengkapnya untuk menentukan hasil bagi dan sisa dalam Metode Hörner dengan menggunakan makro tersebut, kemudian hasilnya dapat Anda lihat pada gambar di atas.
    \documentclass{article}
    \usepackage{xparse}
    
    \input{horner.tex}
    
    \begin{document}
    
    $\horner{1,2,3,-5}{2}$
    
    \bigskip
    
    $\horner{1,-6,-6,8,6}{2}$
    
    \bigskip
    
    $\horner{4,0,3,-6,1}{1/2}$
    
    \end{document}


    Penutup

    Demikianlah, dokumen terakhir ini saya susun dalam jaringan melalui Online LaTeX Editor ShareLaTeXSemoga bermanfaat.

    Adjie Gumarang Pujakelana 2015


    Metode Hörner Metode Hörner Reviewed by Eman Sulaeman on 21.03 Rating: 5

    Tidak ada komentar:

    Laman Portal Matematika Nusantara

    Diberdayakan oleh Blogger.