#include <stdio.h>
#include<math.h>
typedef struct { double val[ 3 ] ; } vect;
typedef double ( * Func) ( vect) ;
#define EPSILON 0.00001
#define N 3 //未知数の数
int printA( double a[ N] [ N+ 1 ] ) ;
void gauss( double a[ N] [ N+ 1 ] , double x[ N] ) ;
int gauss_jordan( int n, double a[ N] [ N+ 1 ] , double b[ N] ) ;
int printV( vect X) { for ( int i= 0 ; i< 3 ; i++ ) printf ( "%10.3f" ,X.val [ i] ) ; printf ( "\n " ) ; }
double f1( vect X) {
double x= X.val [ 0 ] ,y= X.val [ 1 ] ,z= X.val [ 2 ] ;
return - y* y * z* z - y* y + 24 * y* z - z* z - 13 ; }
double f2( vect X) {
double x= X.val [ 0 ] ,y= X.val [ 1 ] ,z= X.val [ 2 ] ;
return - x* x * z* z - x* x + 24 * x* z - z* z - 13 ; }
double f3( vect X) {
double x= X.val [ 0 ] ,y= X.val [ 1 ] ,z= X.val [ 2 ] ;
return - x* x * y* y - x* x + 24 * x* y - y* y - 13 ; }
vect d2v( double a,double b,double c) { vect x; x.val [ 0 ] = a; x.val [ 1 ] = b; x.val [ 2 ] = c; return x; }
vect vect_add( vect x, vect y) { vect z; z.val [ 0 ] = x.val [ 0 ] + y.val [ 0 ] ; z.val [ 1 ] = x.val [ 1 ] + y.val [ 1 ] ; z.val [ 2 ] = x.val [ 2 ] + y.val [ 2 ] ; return z; }
vect vect_hiku( vect x, vect y) { vect z; z.val [ 0 ] = x.val [ 0 ] - y.val [ 0 ] ; z.val [ 1 ] = x.val [ 1 ] - y.val [ 1 ] ; z.val [ 2 ] = x.val [ 2 ] - y.val [ 2 ] ; return z; }
double bibun_x( Func f, vect a) { return ( f( vect_add( a,d2v( EPSILON,0 ,0 ) ) ) - f( a) ) / EPSILON; }
double bibun_y( Func f, vect a) { return ( f( vect_add( a,d2v( 0 ,EPSILON,0 ) ) ) - f( a) ) / EPSILON; }
double bibun_z( Func f, vect a) { return ( f( vect_add( a,d2v( 0 ,0 ,EPSILON) ) ) - f( a) ) / EPSILON; }
int main( ) {
vect V= d2v( 1 ,1 ,1 ) ;
double a[ 3 ] [ 4 ] , X[ 3 ] ;
for ( int i = 0 ; i < 10 ; i++ ) {
a[ 0 ] [ 0 ] = bibun_x( f1,V) ; a[ 0 ] [ 1 ] = bibun_y( f1,V) ; a[ 0 ] [ 2 ] = bibun_z( f1,V) ;
a[ 1 ] [ 0 ] = bibun_x( f2,V) ; a[ 1 ] [ 1 ] = bibun_x( f2,V) ; a[ 1 ] [ 2 ] = bibun_x( f2,V) ;
a[ 2 ] [ 0 ] = bibun_x( f3,V) ; a[ 2 ] [ 1 ] = bibun_x( f3,V) ; a[ 2 ] [ 2 ] = bibun_x( f3,V) ;
a[ 0 ] [ 3 ] = V.val [ 0 ] ; a[ 1 ] [ 3 ] = V.val [ 1 ] ; a[ 2 ] [ 3 ] = V.val [ 2 ] ;
X[ 0 ] = V.val [ 0 ] ; X[ 1 ] = V.val [ 1 ] ; X[ 2 ] = V.val [ 2 ] ;
//printV(V);printA(a);gauss(a,X);
gauss_jordan( 3 , a, X) ;
V = vect_hiku( V, d2v( X[ 0 ] ,X[ 1 ] ,X[ 2 ] ) ) ;
printV( V) ;
}
return 0 ;
}
//http://s...content-available-to-author-only...e.jp/wiki/wiki.cgi?page=%CF%A2%CE%A9%B0%EC%BC%A1%CA%FD%C4%F8%BC%B0%A4%CE%B2%F2%CB%A1
void gauss( double a[ N] [ N+ 1 ] , double x[ N] ) {
int i,j,k,l,pivot;
double p,q,m,tmp;
/*縦方向のループ*/
for ( i= 0 ; i< N; i++ ) {
m= 0 ;
pivot= i;
/*i列中でi行目より下にある要素内で最大を選ぶ*/
for ( l= i; l< N; l++ ) {
/*i列の中で一番値が大きい行を選ぶ*/
if ( fabs ( a[ l] [ i] ) > m) {
m= fabs ( a[ l] [ i] ) ;
pivot= l;
}
}
/*pivotがiと違えば、行の入れ替え(これを部分ピボットと呼ぶ)*/
if ( pivot! = i) {
for ( j= 0 ; j< N+ 1 ; j++ ) {
tmp= a[ i] [ j] ;
a[ i] [ j] = a[ pivot] [ j] ;
a[ pivot] [ j] = tmp;
}
}
}
for ( k= 0 ; k< N; k++ ) {
p= a[ k] [ k] ; //対角要素を保存
/*対角要素は1になることがわかっているので直接代入*/
a[ k] [ k] = 1 ;
/*k行目でk+1列より右にあるすべての要素を対角成分で割る*/
for ( j= k+ 1 ; j< N+ 1 ; j++ ) {
a[ k] [ j] / = p;
}
for ( i= k+ 1 ; i< N; i++ ) {
q= a[ i] [ k] ;
for ( j= k+ 1 ; j< N+ 1 ; j++ ) {
a[ i] [ j] - = q* a[ k] [ j] ;
}
/*0となることがわかっているので直接代入*/
a[ i] [ k] = 0 ;
}
}
/*解の計算*/
for ( i= N- 1 ; i>= 0 ; i-- ) {
x[ i] = a[ i] [ N] ;
for ( j= N- 1 ; j> i; j-- ) {
x[ i] - = a[ i] [ j] * x[ j] ;
}
}
}
int printA( double a[ N] [ N+ 1 ] ) {
int i,j;
for ( i= 0 ; i< N; i++ ) {
for ( j= 0 ; j< N+ 1 ; j++ ) {
printf ( "%10.3f" ,a[ i] [ j] ) ;
}
printf ( "\n " ) ;
}
}
//http://w...content-available-to-author-only...0.jp/yamamoto/lecture/2006/5E/Linear_eauations/gaussj_html/node2.html#SECTION00021000000000000000
int gauss_jordan( int n, double a[ N] [ N+ 1 ] , double b[ N] ) {
int ipv, i, j;
double inv_pivot, temp;
double big;
int pivot_row, row[ 30 ] ;
for ( ipv= 1 ; ipv <= n ; ipv++ ) {
/* ---- 最大値探索 ---------------------------- */
big= 0.0 ;
for ( i= ipv ; i<= n ; i++ ) {
if ( fabs ( a[ i] [ ipv] ) > big) {
big = fabs ( a[ i] [ ipv] ) ;
pivot_row = i;
}
}
if ( big == 0.0 ) { return 0 ; }
row[ ipv] = pivot_row;
/* ---- 行の入れ替え -------------------------- */
if ( ipv ! = pivot_row) {
for ( i= 1 ; i<= n ; i++ ) {
temp = a[ ipv] [ i] ;
a[ ipv] [ i] = a[ pivot_row] [ i] ;
a[ pivot_row] [ i] = temp;
}
temp = b[ ipv] ;
b[ ipv] = b[ pivot_row] ;
b[ pivot_row] = temp;
}
/* ---- 対角成分=1(ピボット行の処理) ---------- */
inv_pivot = 1.0 / a[ ipv] [ ipv] ;
a[ ipv] [ ipv] = 1.0 ;
for ( j= 1 ; j <= n ; j++ ) {
a[ ipv] [ j] * = inv_pivot;
}
b[ ipv] * = inv_pivot;
/* ---- ピボット列=0(ピボット行以外の処理) ---- */
for ( i= 1 ; i<= n ; i++ ) {
if ( i ! = ipv) {
temp = a[ i] [ ipv] ;
a[ i] [ ipv] = 0.0 ;
for ( j= 1 ; j<= n ; j++ ) {
a[ i] [ j] - = temp* a[ ipv] [ j] ;
}
b[ i] - = temp* b[ ipv] ;
}
}
}
/* ---- 列の入れ替え(逆行列) -------------------------- */
for ( j= n ; j>= 1 ; j-- ) {
if ( j ! = row[ j] ) {
for ( i= 1 ; i<= n ; i++ ) {
temp = a[ i] [ j] ;
a[ i] [ j] = a[ i] [ row[ j] ] ;
a[ i] [ row[ j] ] = temp;
}
}
}
return 1 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlPG1hdGguaD4KCgp0eXBlZGVmIHN0cnVjdCB7IGRvdWJsZSB2YWxbM107IH0gdmVjdDsKCgp0eXBlZGVmIGRvdWJsZSAoKkZ1bmMpKHZlY3QpOwoKI2RlZmluZSBFUFNJTE9OIDAuMDAwMDEKI2RlZmluZSBOIDMgICAgICAgICAgICAgICAgICAgIC8v5pyq55+l5pWw44Gu5pWwCgppbnQgcHJpbnRBKGRvdWJsZSBhW05dW04rMV0pOwp2b2lkIGdhdXNzKGRvdWJsZSBhW05dW04rMV0sIGRvdWJsZSB4W05dKTsKaW50IGdhdXNzX2pvcmRhbihpbnQgbiwgZG91YmxlIGFbTl1bTisxXSwgZG91YmxlIGJbTl0pOwoKCmludCBwcmludFYodmVjdCBYKXsgZm9yKGludCBpPTA7aTwzO2krKykgcHJpbnRmKCIlMTAuM2YiLFgudmFsW2ldKTsJICBwcmludGYoIlxuIik7IH0KCgpkb3VibGUgZjEodmVjdCBYKXsgCmRvdWJsZSB4PVgudmFsWzBdLHk9WC52YWxbMV0sej1YLnZhbFsyXTsKcmV0dXJuIC15KnkgKiB6KnogLSB5KnkgKyAyNCp5KnogLSB6KnogLTEzOyB9Cgpkb3VibGUgZjIodmVjdCBYKXsgCmRvdWJsZSB4PVgudmFsWzBdLHk9WC52YWxbMV0sej1YLnZhbFsyXTsKcmV0dXJuIC14KnggKiB6KnogLSB4KnggKyAyNCp4KnogLSB6KnogLTEzOyB9Cgpkb3VibGUgZjModmVjdCBYKXsgCmRvdWJsZSB4PVgudmFsWzBdLHk9WC52YWxbMV0sej1YLnZhbFsyXTsKcmV0dXJuIC14KnggKiB5KnkgLSB4KnggKyAyNCp4KnkgLSB5KnkgLTEzOyB9CgoKdmVjdCBkMnYoZG91YmxlIGEsZG91YmxlIGIsZG91YmxlIGMpIHsgdmVjdCB4OyB4LnZhbFswXT1hOyB4LnZhbFsxXT1iOyB4LnZhbFsyXT1jOyByZXR1cm4geDsgfQp2ZWN0IHZlY3RfYWRkKHZlY3QgeCwgdmVjdCB5KSB7IHZlY3Qgejsgei52YWxbMF09eC52YWxbMF0reS52YWxbMF07ICB6LnZhbFsxXT14LnZhbFsxXSt5LnZhbFsxXTsgIHoudmFsWzJdPXgudmFsWzJdK3kudmFsWzJdOyByZXR1cm4gejsgfQp2ZWN0IHZlY3RfaGlrdSh2ZWN0IHgsIHZlY3QgeSkgeyB2ZWN0IHo7IHoudmFsWzBdPXgudmFsWzBdLXkudmFsWzBdOyAgei52YWxbMV09eC52YWxbMV0teS52YWxbMV07ICB6LnZhbFsyXT14LnZhbFsyXS15LnZhbFsyXTsgcmV0dXJuIHo7IH0KCmRvdWJsZSBiaWJ1bl94KEZ1bmMgZiwgdmVjdCBhKSB7IHJldHVybiAgKCBmKHZlY3RfYWRkKGEsZDJ2KEVQU0lMT04sMCwwKSkpIC0gZihhKSApL0VQU0lMT047ICB9CmRvdWJsZSBiaWJ1bl95KEZ1bmMgZiwgdmVjdCBhKSB7IHJldHVybiAgKCBmKHZlY3RfYWRkKGEsZDJ2KDAsRVBTSUxPTiwwKSkpIC0gZihhKSApL0VQU0lMT047ICB9CmRvdWJsZSBiaWJ1bl96KEZ1bmMgZiwgdmVjdCBhKSB7IHJldHVybiAgKCBmKHZlY3RfYWRkKGEsZDJ2KDAsMCxFUFNJTE9OKSkpIC0gZihhKSApL0VQU0lMT047ICB9CgoKCiAKaW50IG1haW4oKSB7CnZlY3QgVj1kMnYoMSwxLDEpOwpkb3VibGUgYVszXVs0XSwgWFszXTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKICBhWzBdWzBdID0gYmlidW5feChmMSxWKTsgIGFbMF1bMV0gPSBiaWJ1bl95KGYxLFYpOyAgYVswXVsyXSA9IGJpYnVuX3ooZjEsVik7CiAgYVsxXVswXSA9IGJpYnVuX3goZjIsVik7ICBhWzFdWzFdID0gYmlidW5feChmMixWKTsgIGFbMV1bMl0gPSBiaWJ1bl94KGYyLFYpOwogIGFbMl1bMF0gPSBiaWJ1bl94KGYzLFYpOyAgYVsyXVsxXSA9IGJpYnVuX3goZjMsVik7ICBhWzJdWzJdID0gYmlidW5feChmMyxWKTsKICBhWzBdWzNdID0gVi52YWxbMF07ICAgYVsxXVszXSA9IFYudmFsWzFdOyAgIGFbMl1bM10gPSBWLnZhbFsyXTsKICBYWzBdID0gVi52YWxbMF07ICAgWFsxXSA9IFYudmFsWzFdOyAgIFhbMl0gPSBWLnZhbFsyXTsKLy9wcmludFYoVik7cHJpbnRBKGEpO2dhdXNzKGEsWCk7CgogZ2F1c3Nfam9yZGFuKDMsIGEsIFgpOwoKViA9IHZlY3RfaGlrdShWLCBkMnYoWFswXSxYWzFdLFhbMl0pKTsKcHJpbnRWKFYpOwp9CnJldHVybiAwOwp9CgoKCgovL2h0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmpwL3dpa2kvd2lraS5jZ2k/cGFnZT0lQ0YlQTIlQ0UlQTklQjAlRUMlQkMlQTElQ0ElRkQlQzQlRjglQkMlQjAlQTQlQ0UlQjIlRjIlQ0IlQTEKCgp2b2lkIGdhdXNzKGRvdWJsZSBhW05dW04rMV0sIGRvdWJsZSB4W05dKXsKICAgICAgICBpbnQgaSxqLGssbCxwaXZvdDsKICAgICAgICBkb3VibGUgcCxxLG0sdG1wOwoKCS8q57im5pa55ZCR44Gu44Or44O844OXKi8KICAgICAgICBmb3IoaT0wO2k8TjtpKyspIHsKCSAgbT0wOwoJICBwaXZvdD1pOwoJICAKCSAgLypp5YiX5Lit44GnaeihjOebruOCiOOCiuS4i+OBq+OBguOCi+imgee0oOWGheOBp+acgOWkp+OCkumBuOOBtiovCgkgIGZvcihsPWk7bDxOO2wrKykgewoJICAgIC8qaeWIl+OBruS4reOBp+S4gOeVquWApOOBjOWkp+OBjeOBhOihjOOCkumBuOOBtiovCgkgICAgaWYoZmFicyhhW2xdW2ldKT5tKSB7CgkgICAgICBtPWZhYnMoYVtsXVtpXSk7CgkgICAgICBwaXZvdD1sOwoJICAgIH0KCSAgfQoKCSAgLypwaXZvdOOBjGnjgajpgZXjgYjjgbDjgIHooYzjga7lhaXjgozmm7/jgYgo44GT44KM44KS6YOo5YiG44OU44Oc44OD44OI44Go5ZG844G2KSovCgkgIGlmKHBpdm90IT1pKSB7ICAKCSAgICBmb3Ioaj0wO2o8TisxO2orKykgewoJICAgICAgdG1wPWFbaV1bal07ICAgICAgICAKCSAgICAgIGFbaV1bal09YVtwaXZvdF1bal07CgkgICAgICBhW3Bpdm90XVtqXT10bXA7CgkgICAgfQoJICB9CiAgICAgICAgfQoJCiAgICAgICAgZm9yKGs9MDtrPE47aysrKSB7CgkgIHA9YVtrXVtrXTsgICAgICAgICAgICAgIC8v5a++6KeS6KaB57Sg44KS5L+d5a2YCgkgIC8q5a++6KeS6KaB57Sg44GvMeOBq+OBquOCi+OBk+OBqOOBjOOCj+OBi+OBo+OBpuOBhOOCi+OBruOBp+ebtOaOpeS7o+WFpSovCgkgIGFba11ba109MTsgICAgICAKCSAgCgkgIC8qa+ihjOebruOBp2srMeWIl+OCiOOCiuWPs+OBq+OBguOCi+OBmeOBueOBpuOBruimgee0oOOCkuWvvuinkuaIkOWIhuOBp+WJsuOCiyovCgkgIGZvcihqPWsrMTtqPE4rMTtqKyspIHsKCSAgICBhW2tdW2pdLz1wOwoJICB9CgkgIAoJICBmb3IoaT1rKzE7aTxOO2krKykgewoJICAgIHE9YVtpXVtrXTsKCSAgICAKCSAgICBmb3Ioaj1rKzE7ajxOKzE7aisrKSB7CgkgICAgICBhW2ldW2pdLT1xKmFba11bal07CgkgICAgfQoJICAgIC8qMOOBqOOBquOCi+OBk+OBqOOBjOOCj+OBi+OBo+OBpuOBhOOCi+OBruOBp+ebtOaOpeS7o+WFpSovCgkgICAgYVtpXVtrXT0wOwoJICB9CiAgICAgICAgfQoJCgkvKuino+OBruioiOeulyovCiAgICAgICAgZm9yKGk9Ti0xO2k+PTA7aS0tKSB7CgkgIHhbaV09YVtpXVtOXTsKCSAgZm9yKGo9Ti0xO2o+aTtqLS0pIHsKCSAgICB4W2ldLT1hW2ldW2pdKnhbal07CgkgIH0KICAgICAgICB9Cgp9CgoKaW50IHByaW50QShkb3VibGUgYVtOXVtOKzFdKXsKICAgICAgICBpbnQgaSxqOwogICAgICAgIGZvcihpPTA7aTxOO2krKykgewoJICBmb3Ioaj0wO2o8TisxO2orKykgewoJICAgIHByaW50ZigiJTEwLjNmIixhW2ldW2pdKTsKCSAgfQoJICBwcmludGYoIlxuIik7CgkgIAogICAgICAgIH0KfQoKCgoKCi8vaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLjAuanAveWFtYW1vdG8vbGVjdHVyZS8yMDA2LzVFL0xpbmVhcl9lYXVhdGlvbnMvZ2F1c3NqX2h0bWwvbm9kZTIuaHRtbCNTRUNUSU9OMDAwMjEwMDAwMDAwMDAwMDAwMDAKaW50IGdhdXNzX2pvcmRhbihpbnQgbiwgZG91YmxlIGFbTl1bTisxXSwgZG91YmxlIGJbTl0pIHsKCSAgIGludCBpcHYsIGksIGo7CgkgICBkb3VibGUgaW52X3Bpdm90LCB0ZW1wOwoJICAgZG91YmxlIGJpZzsKCSAgIGludCBwaXZvdF9yb3csIHJvd1szMF07CgoJICAgZm9yKGlwdj0xIDsgaXB2IDw9IG4gOyBpcHYrKyl7CgoJICAgICAgLyogLS0tLSDmnIDlpKflgKTmjqLntKIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJICAgICAgYmlnPTAuMDsKCSAgICAgIGZvcihpPWlwdiA7IGk8PW4gOyBpKyspewoJICAgICAgICAgaWYoZmFicyhhW2ldW2lwdl0pID4gYmlnKXsKCSAgICAgICAgICAgIGJpZyA9IGZhYnMoYVtpXVtpcHZdKTsKCSAgICAgICAgICAgIHBpdm90X3JvdyA9IGk7CgkgICAgICAgICB9CgkgICAgICB9CgkgICAgICBpZihiaWcgPT0gMC4wKXtyZXR1cm4gMDt9CQoJICAgICAgcm93W2lwdl0gPSBwaXZvdF9yb3c7CgoJICAgICAgLyogLS0tLSDooYzjga7lhaXjgozmm7/jgYggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCSAgICAgIGlmKGlwdiAhPSBwaXZvdF9yb3cpewoJICAgICAgICAgZm9yKGk9MSA7IGk8PW4gOyBpKyspewoJICAgICAgICAgICAgdGVtcCA9IGFbaXB2XVtpXTsKCSAgICAgICAgICAgIGFbaXB2XVtpXSA9IGFbcGl2b3Rfcm93XVtpXTsKCSAgICAgICAgICAgIGFbcGl2b3Rfcm93XVtpXSA9IHRlbXA7CgkgICAgICAgICB9CgkgICAgICAgICB0ZW1wID0gYltpcHZdOwoJICAgICAgICAgYltpcHZdID0gYltwaXZvdF9yb3ddOwoJICAgICAgICAgYltwaXZvdF9yb3ddID0gdGVtcDsKCSAgICAgIH0KCgkgICAgICAvKiAtLS0tIOWvvuinkuaIkOWIhj0xKOODlOODnOODg+ODiOihjOOBruWHpueQhikgLS0tLS0tLS0tLSAqLwoJICAgICAgaW52X3Bpdm90ID0gMS4wL2FbaXB2XVtpcHZdOwoJICAgICAgYVtpcHZdW2lwdl09MS4wOwoJICAgICAgZm9yKGo9MSA7IGogPD0gbiA7IGorKyl7CgkgICAgICAgICBhW2lwdl1bal0gKj0gaW52X3Bpdm90OwoJICAgICAgfQoJICAgICAgYltpcHZdICo9IGludl9waXZvdDsKCgkgICAgICAvKiAtLS0tIOODlOODnOODg+ODiOWIlz0wKOODlOODnOODg+ODiOihjOS7peWkluOBruWHpueQhikgLS0tLSAqLwoJICAgICAgZm9yKGk9MSA7IGk8PW4gOyBpKyspewoJICAgICAgICAgaWYoaSAhPSBpcHYpewoJICAgICAgICAgICAgdGVtcCA9IGFbaV1baXB2XTsKCQkgICAgYVtpXVtpcHZdPTAuMDsKCSAgICAgICAgICAgIGZvcihqPTEgOyBqPD1uIDsgaisrKXsKCSAgICAgICAgICAgICAgIGFbaV1bal0gLT0gdGVtcCphW2lwdl1bal07CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBiW2ldIC09IHRlbXAqYltpcHZdOwoJICAgICAgICAgfQoJICAgICAgfQoKCSAgIH0KCgkgICAvKiAtLS0tIOWIl+OBruWFpeOCjOabv+OBiCjpgIbooYzliJcpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkgICBmb3Ioaj1uIDsgaj49MSA7IGotLSl7CgkgICAgICBpZihqICE9IHJvd1tqXSl7CgkgICAgICAgICBmb3IoaT0xIDsgaTw9biA7IGkrKyl7CgkgICAgICAgICAgICB0ZW1wID0gYVtpXVtqXTsKCSAgICAgICAgICAgIGFbaV1bal09YVtpXVtyb3dbal1dOwoJICAgICAgICAgICAgYVtpXVtyb3dbal1dPXRlbXA7CgkgICAgICAgICB9CgkgICAgICB9CgkgICB9CgoJICAgcmV0dXJuIDE7Cgl9