مفاهیم اولیه زبان c  (بخش 3)

تابع خواندن از ورودی

برای خواندن اطلاعات از ورودی از تابع scanf استفاده می شود. این تابع اطلاعات را ازورودی استاندارد (معمولا صفحه كلید) خوانده و در متغیرهای تعیین شده قرار می دهد. شكل كلی این تابع بصورت زیر است:

scanf(< لیست متغیرها > , < رشته کنترلی >) ;

همانطور كه می بینید نحوه احضار تابع scanf نیز مشابه printf است. تنها تفاوت در آن است كه در scanf باید لیست آدرسهای متغیرها ارسال شود. مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از علامت & استفاده می كنیم. بعنوان مثال &age بمعنای آدرس متغیر age است. بطور كلی در C قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود (یعنی پارامترهایی كه یك مقدار را باز می گرداندند) از آدرس متغیرها استفاده می شد كه امروزه این مسئله وجود ندارد.

رشته كنترلی حاوی تعداد و نوع متغیرهایی است كه باید دریافت شوند و از همان مشخصه های تبدیل مربوط به printf استفاده می كند. به مثال زیر توجه كنید:

#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

 

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

لازم به ذكر است كه هنگامی كه قصد وارد كردن دو عدد فوق را دارید، هم می توانید این دو عدد را با یك فاصله (فضای خالی یا tab) نوشته و سپس كلید enter را فشار دهید و یا پس از نوشتن هر عدد كلید enter را فشار دهید.

توجه كنید كه معمولا رشته كنترلی فقط حاوی مشخصه های تبدیل است و هیچ متنی در آن نوشته نشده است. ازنظر منطقی نیز این كار درست است ولی چنانچه متنی در آن نوشته شود بدین معنا است كه كاربر باید علاوه بر داده های مورد نظر، عین آن متن را نیز وارد كند. بعنوان مثال عبارت زیر:

scanf("level=%d", &a) ;

بدین معناست كه كاربر باید ابتدا كلمه level= را عینا تایپ كرده و سپس عدد موردنظر را وارد نماید. معمولا از چنین حالاتی استفاده نمی گردد.

نكته آخر اینكه در scanf نیز می توان از مواردی همچون طول میدان برای كنترل نحوه ورود اطلاعات استفاده كرد كه از حوصله بحث ما خارج است. برای اطلاعات بیشتر به Help كامپایلر خود مراجعه نمایید.

نکته مهم: توابع printf و scanf از رنگ استاندارد یعنی سفید برروی زمینه مشکی استفاده می کنند، اما می توانید برای تغییر رنگ از توابع textcolor و textbackground نیز استفاده کنید. البته دراینصورت برای دریافت و نمایش اطلاعات نیز باید از توابع cprintf و cscanf استفاده نمایید. برای توضیحات بیشتر به Help کامپایلر خود مراجعه کنید.

ورودی و خروجی اطلاعات در CPP

زبان C++ یک زبان شی گرا است، بهمین دلیل در این زبان برای ورودی و خروجی از اشیاء بجای توابع استفاده می گردد. از آنجا که امروزه معمولا برنامه نویسان C از کامپایلرهای C++ استفاده می کنند، می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند. اینکار در بین بسیاری از برنامه نویسان C متداول است، بهمین دلیل ما در اینجا نحوه کار با اشیای خواندن و نوشتن در C++ را بطور مقدماتی توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی گرایی و زبان C++ دارد. قبل از هرچیز لازم به ذکر است که کلیه اشیای مربوط به ورودی و خروجی در فایل سرآمدی بنام iostream.h تعیریف شده اند، بنابراین ابتدا باید این فایل به برنامه توسط دیتور #include الحاق گردد.

زبان C++ برای نمایش اطلاعات از یک شیئ بنام cout استفاده می نماید. برای ارسال اطلاعات مورد نظر برای چاپ به cout باید از عملگر درج در جریان یا >> استفاده نماییم. بعنوان مثال :

cout << “Please enter your name: ” ;

و یا مثال دیگر :

int a = 10;
float b = 2.86;
cout << a;
cout << b;

نکته جالبی که در این مثالها دیده می شود، آنستکه برخلاف تابع printf هیچ نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود شئ cout نوع آن را تشخیص می دهد. علاوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و چندین متغیر را با یک دستور چاپ کرد. بعنوان مثال به برنامه زیر دقت کنید:

#include < iostream.h >
void main() {
int age = 20;
floate average = 18.23;
cout << “You are ” << age << “ years old and your average is ” << average ;
}

 

You are 20 years old and your average is 18.230000

برای دریافت اطلاعات از کاربر، از شئ دیگری بنام cin استفاده می شود. برای ارسال متغیر مورد نظر به cin باید از عملگر استخراج از جریان یا << استفاده نماییم. بعنوان مثال:

int a;
cin >> a;

بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود شئ cin نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از کاربر دریافت و در متغیر مورد نظر قرار می دهد. عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد. اکنون به یک برنامه کاملتر توجه کنید:

#include < iostream.h >
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

 

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

برای رفتن به خط بعد در شئ cout می توان از دستکاری کننده endl استفاده کرد. مثلا در دستور زیر پس از چاپ پیغام، مکان نما به خط بعد منتقل می شود:

cout << “List of students : “ << endl;

البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل دارد.

توابع کتابخانه ای

همانطور که قبلا نیز گفته شد، زبان C از زیر برنامه ها نیز حمایت می کند. هر زیر برنامه در C یک تابع نامیده می شود که آن را بطور مفصل در فصول بعدی بررسی خواهیم کرد. تا کنون با توابعی همچون main و یا printf و scanf آشنا شده ایم.

معمولا عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار، برخی از توابع عمومی را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند (این کتابخانه ها ممکن است مجانی باشند و یا نیاز به پرداخت مبلغی داشته باشند). بعضی از این توابع کتابخانه ای مانند printf و scanf بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می شوند.

در کامپایلر عرضه شده توسط شرکت بورلند (Borland C++ 3.1) نیز کتابخانه های متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید شد. نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در ابتدای برنامه خود اضافه نمایید ( با استفاده از #include). هر فایل سرآمد شامل تعاریف اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی تر دارای پسوند .h می باشد(در استاندارد جدید پسوند این فایلها حذف شده است). برخی از این فایلهای سرآمد عبارتند از:

stdio.h : توابع ورودی و خروجی استاندارد
math.h :
توابع ریاضی
graphics.h :
توابع مربوط به عملیات گرافیکی
string.h :
توابع مربوط به کار با رشته ها

البته تعداد این فایلها و توابع مربوطه بسیار زیاد است و در آینده با هریک از آنها بنا به کاربرد، آشنا خواهید شد.

 

مفاهیم اولیه زبان c  (بخش 2)

عملگرها

عملگر، نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا منطقی خاصی را برروی یك یا چند عملوند، انجام دهد. به عملگرهایی كه فقط یك عملوند دارند، عملگر یكانی می گوییم و همواره عملگر در سمت چپ عملوند قرار می گیرد(مانند عدد -125). اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی نامیده و عملگر را بین دو عملوند قرار می دهیم (مانند 23+86). هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم.


C
از نقطه نظر عملگرها یك زبان بسیار قوی است. این عملگرها به چند دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم..

عملگرهای محاسباتی

این عملگرها، همان اعمال متداول ریاضی هستند كه در زبان C مورد استفاده قرار می گیرند. این اعمال عبارتند از :

عمل

نوع

عملگر

منفی كردن عملوند سمت راست

یكانی

-

جمع دو عملوند

دودویی

+

تفریق دو عملوند

دودویی

-

ضرب دو عملوند

دودویی

*

تقسیم دو عملوند

دودویی

/

محاسبه باقیمانده تقسیم دو عملوند

دودویی

%

 

عملگرهای فوق برروی همه انواع داده های C عمل می كنند بجز عملگر % كه فقط برروی نوع داده های صحیح عمل میكند و برروی داده های اعشاری تعریف نشده است. اما نكته مهمی كه باید به آن اشاره كرد، نحوه كار عملگر تقسیم برروی نوع داده های مختلف است. درصورتیكه هردو عملوند صحیحی باشند، تقسیم بصورت صحیح بر صحیح انجام خواهد شد. اما اگر یكی یا هر دو عملوند اعشاری باشند، تقسیم بصورت اعشاری انجام خواهد پذیرفت. فرض كنید تعاریف زیر را داریم :

int a,b ;
float c,d ;
a = 10 ; b = 4 ;
c = 8.2; d = 4.0;

اكنون به نتایج عملیات زیر دقت كنید :

a / b = < 2
c / d = < 2.05
a / d = < 2.5
a / 4 = < 2

چنانچه به آخرین مورد توجه كنید، متوجه می شوید كه از آنجا كه a یك متغیر صحیح است و 4 نیز یك ثابت صحیح در نظر گرفته شده، درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته است. چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد، به دو شكل می توانیم عمل كنیم. اول اینكه آن را بصورت a / 4.0 بنویسیم و دوم اینكه از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید. شكل كلی آن به شكل زیر است :

(< type >) < expression >

 

كه type نوع مورد نظر است كه قصد تبدیل عبارت expression به آن نوع را داریم. بعنوان مثال در مورد بالا می توان به شكل زیر عمل كرد :

(float) a / 4

در این حالت ابتدا از كامپایلر خواسته ایم كه ابتدا عدد a را به اعشاری تبدیل كند (البته بصورت موقت) و سپس آن را بر 4 تقسیم نماید، كه مسلما حاصل اعشاری خواهد بود.
بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی داشته باشیم، كامپایلر C همه آنها را به یك نوع یكسان كه همان بزرگترین عملوند موجود است تبدیل خواهد كرد. بعنوان مثال به مورد زیر دقت كنید :

 

نكته بسار مهم دیگری كه باید به آن توجه كرد، اولویت عملگرها است. یعنی در عبارتی که شامل چندین عملگر است، کدامیک در ابتدا اعمال خواهد گردید. اولویت عملگرهای محاسباتی از بالا به پایین بشرح زیر است:

1        عملگر یکانی

2        عملگرهای * و / و %

3        عملگرهای + و

 

چنانچه اولویت دو عملگر یکسان باشد، این عملگرها از چپ به راست محاسبه خواهند شد. چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود، باید از پرانتز استفاده کنیم. بنابراین اولویت عملگر پرانتز از همه موارد فوق بیشتراست. در مورد پرانتزهای متداخل، ابتدا پرانتز داخلی محاسبه می شود؛ اما در مورد پرانتزهای هم سطح، ابتدا پرانتز سمت چپتر محاسبه می گردد. به چند مثال زیر دقت کنید:

 

عبارت زبان c

ترتیب اجرای عملگرها

b + c * d

ابتدا عمل * و سپس عمل +

(b + c) * d

ابتدا عمل + و سپس عمل *

b + c / d * e

ابتدا عمل / سپس عمل * و در انتها عمل +

b + c / (d * e)

ابتدا عمل * سپس عمل / و در انتها عمل +

 

مثال زیر، یک مثال کامل در این زمینه می باشد :

عملگرهای انتساب

در زبان C برای انتساب چندین عملگر وجود دارد. ساده ترین عملگر انتساب، همان عملگر = است که در بسیاری از زبانها استفاده می شود. بعنوان مثال :

a = 5;
b = c + 2 * d;

این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد. توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد(مانند یک متغیر) که به آن Lvalue گفته می شود، بنابراین یک ثابت نمی تواند در سمت چپ قرار گیرد. نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود. لازم به ذکر است که در هنگام انتساب، درصورت لزوم نوع عبارت سمت راست به نوع عبارت سمت چپ تبدیل می شود. مثال:

int a;
a = 2.5 * 5.0;

که دراینصورت عدد 12 در a ذخیره خواهد شد.
شرکت پذیری این عملگر از راست به چپ می باشد، بدین معنا که چنانچه چندین عملگر نسبت دهی داشته باشیم، این عملگرها از راست به چپ محاسبه می شوند. مثلا پس از اجرای دستور زیر :

a = b = c = 10;

مقدار هر 3 متغیر برابر 10 خواهد شد.
نکته جالب درمورد زبان C آنستکه دارای یک سری عملگرهای انتساب خلاصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات کوتاهتری را بنویسیم. این عملگرها عبارتند از :

عملگر

مثال

عبارت انتساب معادل

++

a ++;

a = a + 1;

--

a --;

a = a – 1;

+=

a += 5;

a = a + 5;

-=

a -= 8;

a= a – 8;

*=

a *= 10;

a= a * 10;

/=

a /= 2;

a = a / 2;

%=

a %= 10;

a = a % 10;

عملگر اول و دوم، عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش نامیده می شوند. نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند. در حالتی که از دستور a ++; استفاده شود به آن پس افزایش می گویند و بدین معناست که ابتدا از مقدار فعلی a در عبارت موردنظر استفاده کن و سپس آن را افزایش بده. اما دستور ++ a که به آن پیش افزایش گفته می شود، ابتدا a را افزایش داده و سپس از آن در عبارت استفاده می کند. به برنامه زیر دقت کنید:

#include < stdio.h >
void main() {
int a ,b ;
a = 5 ;
b = a ++;
printf(“a=%d and b=%d \n”,a,b);
a = 5 ;
b = ++ a;
printf(“a=%d and b=%d \n”,a,b);
}

 

a=6 b=5
a=6 b=6

و اما پنج عملگر بعدی هنگامی می توانند استفاده شوند که عبارتی بصورت زیر داشته باشیم:

عبارت عملگر متغیر = متغیر

که عملگر یکی از عملگرهای محاسباتی ( + ، - ، * یا / ) باشد، دراینصورت می توانیم آن را بصورت زیر بنویسیم:

عبارت =عملگر متغیر

عملگرهای مقایسه ای (رابطه ای)

این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند. نتیجه می تواند درست (true) یا غلط (false) باشد. همانطور که قبلا نیز گفته شد در کامپایلرهای جدید C++ نوع داده bool اضافه شده است و بنابراین نتیجه این عملگرها یک مقدار bool است. اما در کامپایلرهای قدیمیتر، نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن 1 و درصورت غلط بودن 0 باز می گردانند. این عملگرها عبارتند از:

 

عملگر

مفهوم عملگر

مثال

< 

بزرگتر (<)

a > b

> 

کوچکتر (>)

a < b

=<

بزرگتر یا مساوی (≤)

a >= b

=>

کوچکتر یا مساوی (≥)

a <= b

==

مساوی (=)

a == b

=!

نامساوی (≠)

a != b

نکته مهمی که باید به آن دقت کرد عملگر مساوی (==) است، چرا که یک اشتباه بسیار متداول برنامه نویسان C استفاده اشتباه از عملگر انتساب (=) بجای عملگر تساوی (==) است که باعث ایجاد خطا در برنامه می شود.
اولویت این عملگرها از بالا به پایین بشرح زیر است:
3
عملگرهای <، > ، =< و = >
4
عملگرهای == و =!
لازم بذکر است که در هنگام مساوی بودن اولویت چند عملگر، این عملگرها از چپ به راست محاسبه می گردند.
عملگرهای منطقی
این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده و شرطهای پیچیده تری را بسازید. این عملگرها عبارتند از :

 

عملگر

مفهوم عملگر

نحوه کار

مثال

&&

AND منطقی

اگر هر دو عملوند درست باشند, درست و در غیر اینصورت نادرست باز می گرداند.

a>0 && sw==1

||

OR منطقی

اگر هر دو عملوند نادرست باشند, نادرست و در غیر اینصورت درست باز می گرداند.

a<=100 || b!=0

!

NOT منطقی

اگر عملوند درست باشد، نادرست و اگر نادرست باشد، درست برمی گرداند.

! (a==1 || b<10)

همانطور که قبلا نیز گفته شد مقدار بازگشتی این عملگرها، درست (1) یا نادرست (0) می باشد. اولویت این عملگرها بترتیب عبارتست از :

1- عملگر !

2- عملگر &&

 3- عملگر ||

عملگر شرطی

گاهی لازم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه (درست یا نادرست بودن آن) یکی از دو عبارت ممکن بازگردانده شود. گرچه معمولا برای اینکار از دستور if (که در فصل بعدی بحث شده است) استفاده می شود، اما یک عملگر 3تایی (با 3 عملوند) نیز برای آن وجود دارد. شکل کلی این عملگر بصورت زیر است:

عبارت2 : عبارت1 ? شرط

نحوه کار بدینصورت است که درصورت درست بودن شرط عبارت1 و در غیراینصورت عبارت 2 بازگردانده می شود. مثال :

a = (k<10) ? 100 : 50;

که این عبارت معادل دستور زیر است:

if(k<10) a=100;
else a=50;

البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد. مثلا :


c += (a>0 &&a<10) ? ++a : a/b;
که معادل است با :
if (a>0 &&a<10) {
a= a + 1;
c = c + a;
}
else c = c + a/b;


که البته توصیه می شود از این عبارات پیچیده استفاده نشود.

چند نکته درمورد عملگرها


در یک عبارت می توان بین عملوندها و عملگرها از فضاهای خالی به میزان دلخواه استفاده کرد. گرچه استفاده از فضای خالی اجباری نیست اما معمولا باعث بالا رفتن خوانایی عبارت می گردد. علاوه براین در عبارات پیچیده می توان از پرانتز برای نشان دادن ترتیب اجرای عملگرها، حتی درمواردی که مورد نیاز نباشد استفاده کرد. بعنوان مثال به مورد زیر توجه کنید:

شکل نامناسب

result=a-b*c/d+f*g;

شکل بهتر

result = a – b * c / d + f * g

شکل کاملا مناسب

result = a – ( b * c / d) + (f * g)


مورد دیگری که باید به آن اشاره کرد، نحوه محاسبه عبارات پیچیده ای است که عملگرهای مختلفی در آنها استفاده شده باشد. درچنین حالتی باید از اولویت گروههای مختلف عملگرها نسبت به یکدیگر آگاه باشیم. جدول زیر اولویت عملگرهای گفته شده تاکنون را بترتیب از بالا به پایین آ ورده است:

 

اولویت

عملگر

شرکت پذیری

1

()

از چپ به راست

2

++   --   !   +   -

از راست به چپ

3

%   /   *

از چپ به راست

4

-   +

از چپ به راست

5

>>   <<

از چپ به راست

6

>=   >   <=   <

از چپ به راست

7

=!   ==

از چپ به راست

8

&&

از چپ به راست

9

||

از چپ به راست

10

?:

از راست به چپ

11

=%   =/   =*   =-   =+   =

از راست به چپ

12

,

از چپ به راست

 

خواندن و نمایش اطلاعات

همانطور كه قبلا نیز گفته شد، یكی از اهداف زبان C قابل حمل بودن آن است. بهمین منظور سعی شده است كه از دستوراتی كه ممكن است وابسته به ماشین خاصی باشد، اجتناب گردد. بهمین دلیلی زبان C برخلاف سایر زبانها دارای هیچ دستوری برای خواندن از ورودی و یا نوشتن در خروجی نیست.

اما در عوض دارای تعدادی تابع (زیربرنامه) استاندارد می باشد كه تقریبا تمامی كامپایلرها از آنها حمایت می كنند. این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار موردنظر، توابع ورودی و خروجی را طراحی نماید. این توابع در یك فایل سرآمد بنام stdio.h تعریف شده اند و بنابراین قبل ازاینكه بتوانید از این توابع استفاده نمایید، باید این فایل را نیز با استفاده از #include در برنامه خود بگنجانید.

تابع نمایش در خروجی

برای نمایش اطلاعات در خروجی از تابع printf استفاده می شود. این تابع رشته موردنظر شما را به خروجی استاندارد (كه در حالت عادی همان صفحه نمایش یا مانیتور است) می فرستد. شكل كلی این تابع بصورت زیر است:

printf(< لیست متغیرها > , < رشته کنترلی >) ;

رشته كنترلی همان متنی است كه قصد چاپ آن را داریم، با ذكر این نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود، از یك مشخصه تبدیل استفاده می شود. هر مشخصه تبدیل از یك علامت % بعلاوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می گردد. مشخصه تبدیل های متداول عبارتند از :

مفهوم

مشخصه تبدیل

كاراكتر

%c

عدد صحیح در مبنای 10

%d

عدد اعشاری بدون نماد علمی

%f

عدد اعشاری با نماد علمی

%e

عدد اعشاری با حالت كوتاهتر بین e و f

%g

رشته

%s

عدد صحیح بزرگ

%ld

عدد اعشاری بزرگ

%lf  %le  %lg

عدد صحیح در مبنای 8

%o

عدد صحیحی در مبنای 16

%x

عدد صحیح بدون علامت

%u

البته بعضی موارد دیگر نیز وجود دارد كه از بحث فعلی ما خارج است. توجه كنید كه از آنجا كه رشته كنترلی یك ثابت رشته ای است، باید در داخل " قرار گیرد. لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم. این متغیرها باید بترتیب قرار گرفته و با كاما (,) از یكدیگر جدا شوند. برای نمونه به مثال زیر توجه كنید:

#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

دقت كنید كه علامت \n انتهای رشته كنترلی باعث می شود كه خروجی بعدی برنامه (در صورت وجود) در خط بعد چاپ شود. البته ممكن است نحوه چاپ عدد اعشاری به شكل فوق چندان برای شما دلخواه نباشد و بخواهید تعداد ارقام اعشاری قابل نمایش را محدود كنید. برای اینكار باید از مشخصه طول میدان استفاده كنید. مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود:

برای اعداد صحیح از %nd استفاده می كنیم كه n تعداد ارقام را نشان می دهد (مثلا %3d). در اینصورت برای هر متغیر n رقم درنظر گرفته می شود. اگر اندازه عدد از n كوچكتر باشد، به سمت چپ آن فضای خالی اضافه می شود و اگر اندازه عدد بیش از n رقم باشد، طول میدان نادیده گرفته شده و عدد بطور كامل چاپ می شود.

برای اعداد اعشاری از %n.mf استفاده می كنیم كه n اندازه كل عدد (شامل علامت ممیز) و m تعداد ارقام اعشار است (مثلا %5.2f). در صورتیكه تعداد ارقام اعشاری عدد موردنظر از m بیشتر باشد، عدد به m عدد اعشار گرد می شود و در صورتیكه از m كمتر باشد، در سمت راست آن 0 قرار داده می شود.

البته موارد دیگری نیز در مورد نحوه چاپ وجود دارد كه برای اطلاع از آنها می توانید به قسمت Help كامپایلر خود مراجعه نمایید.

آخرین نكته درمورد تابع printf اینكه این تابع مقدار بازگشتی نیز دارد كه درصورت موفقیت عمل چاپ، تعداد كاراكترهای چاپ شده و درصورت عدم موفقیت مقدار -1 را باز می گرداند. البته معمولا از این مقدار بازگشتی صرفنظر می گردد.

 

مقايسه خواص عمومي يك كلاس در C++ و C#

 

 قبل از بررسي تفاوت بين كلاسها بين C++ و C# ابتدا خاصيت هاي عمومي يك كلاس را بررسي كرده سپس به بررسي تفاوت بين اين دو زبان قدرتمند خواهيم پرداخت.

تعريف. كلاس در حالت ساده مجموعه اي از خواص(attributes) و روش ها (methodes) است كه در رابطه با هم هدف مشتركي را دنبال مي كنند و خدماتي را ارائه مي كنند. البته اين تعريف در حد يك تعريف علمي مي باشد ولي ذكر اين نكته ضروري است كه اكثر تعاريف در شي گرايي در طبيعت وجود دارد و در ساده ترين حالت براي تعريف يك كلاس مي توان از تعريف انسان استفاده كرد كه  اين بحث در اين مقاله نمي گنجد. در هر حال ما به تعريف فوق اكتفا كرده و بحث را ادامه مي دهيم.

 خواص ها و روش ها كه در تعريف كلاس ارائه شد مي تواند نحوه دسترسي متفاوتي مانند public و private و protected داشته باشد كه براي برنامه نويسان C++ نيازي به توضيح نيست.

  

تفاوت در تعريف يك كلاس:

چنانچه در مقاله لايه ها در C# نيز اشاره شد يك كلاس در يك برنامه C# در داخل يك لايه تعريف خواهد شد(اجباري نيست). تعريف يك كلاس در C# تفاوتهايي با C++ دارد كه سعي خواهيم كرد اين تفاوت ها را با چند مثال توضيح دهيم.

فرض كنيد كلاس زير در C++ تعريف شده است كه اين كلاس را به يك كلاس C# تبديل خواهيم كرد.

      // Test.h

      class CTest{

            private:

                  int   m_at1;

                  int   f1();

            public:

                  float m_at2;

                  int   f2();

                        CTest();

                        ~CTest();

      };

     

      // Test.cpp

      #include "test.h"

      CTest::CTest(){

            m_at1 = 0;

            m_at2 = 0.0;

      }

      CTest::~CTest(){

            // cout << "destructor call";

      }

      int CTest::f1(){

                  return m_at1;

      }

      int CTest::f2(){

            return m_at1+(int)m_at2;

      }

   

تفاوت اول:

بر خلاف C++ در C# تعريف و نحوه عملكرد يك تابع يا Method در خود تعريف كلاس قرار داده مي شود. در C++ غالبا تعريف كلاس در فايل .h و بدنه توابع در فايل .cpp قرار مي گرفت. البته ذكر اين نكته ضروري است كه مي توان همين عمل را در .h نيز قرار داد ولي در يك برنامه بزرگ اين عمل كنترل برنامه را از دست برنامه نويس خارج كرده و همچنين مشكلات ديگري را براي برنامه نويسان ايجاد مي كند كه برنامه نويسان C++ با اين مشكلات آشنا هستند.

تفاوت دوم:

بر خلاف C++ در C# يك دسته از متغييرها را نمي توان بصورت public يا private و ... تعريف كرد و براي هر متغيير بايد نحوه دسترسي به آن نيز مشخص شود.

 

تفاوت سوم:

بر خلاف C++ در C# تابع destructor وجود ندارد و خود C# مسئول از بين بردن يك شي مي باشد كه اين از بين بردن با توجه به محدوده تعريف اين شي انجام مي شود. البته تعريف destructor وجود دارد ولي نمي توان destructor را فراخواني كرد . در C++ فراخواني Destructor با استفاده از عملگر delete قابل انجام بود ولي چون C# مديريت object ها را خود بعهده مي گيرد شي ايجاد شده نميتواند توسط برنامه خراب شود. اين مطلب در مقالات بعدي مورد بررسي قرار خواهد گرفت.

با توجه به تفاوتهاي ذكر شده مي توان اين كلاس را به صورت زير براي يك كلاس C# ارائه كرد.

     

      // Test.cs

      using System;

      namespace NS

      {

            publicclass CTest

            {

                  privateint   m_at1;

                  public  float m_at2;

                  privateint   f1()

                  {

                              return m_at1;

                  }

                  public  int   f2()

                  {

                              return m_at1+(int)m_at2;

                  }

                  public CTest()

                  {

                        m_at1 = 0;

                        m_at2 = 0.0f;

                  }

                  ~Test()

                  {

                        // Console.WriteLine("destructor call");

                  }

            }

      }

 

ايجاد يك كلاس در ++ و #

در موقع استفاده از يك كلاس اگر از default constructor براي ايجاد يك كلاس استفاده مي شود در C# بايد constructor بصورت void فراخواني شود ( مانند توابع void معمولي)

به مثال زير دقت كنيد.

            // C++ code

            CTest            *a;

            a = new CTest;

 

            // C# Code

            CTest             a;

            a = new CTest();

 

 ذكر اين نكته ضروري است كه در C# وقتي كلاسي تعريف مي شود در واقع اشاره گر به آن كلاس معرفي مي شود بنابراين با تعريف CTest    a كلاسي از CTest ايجاد نمي شود و فقط يك اشاره گر از CTest تعريف مي شود و براي ايجاد يك كلاس استفاده از عملگر new اجباري است.

ولي در C++  تعريف CTest     a به منزله ايجاد يك كلاس و فراخواني Default Constructor مي باشد.

مفاهیم اولیه زبان c  (بخش 1)

 
با توجه به اینکه برنامه نویسی به زبان سی یکی از دروس تخصصی رشته ریاضی است لازم دیدم که جزییاتی در موردش بنویسم که جزییاتی درموردش گفته شود.
 
 
 
 
در این فصل به مقدمات اولیه برنامه نویسی به زبان  C می پردازیم و اصول اولیه آن را بررسی می نماییم
شناسه ها در C
شناسه (identifier) نامی است که به یک قسمت از برنامه مانند متغیر، تابع، ثابت و یا ... داده می شود. در زبان C برای انتخاب شناسه ها فقط می توان از علائم زیر استفاده کرد: - حروف انگلیسی کوچک و بزرگ (A…Z a…z)
-
ارقام (0…9)
-
علامت خط پایین یا _

البته یک شناسه تمی تواند با یک رقم شروع شود. مثلا شناسه های sum ، average ، name2 و یا student_average مجاز هستند، اما شناسه های 2name و یا student average مجاز نیستند. البته در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند student_average از studentAverage استفاده گردد. یعنی بجای اینکه در شناسه ها از _ برای جداکننده استفاده کنیم، اولین حرف هر قسمت را بصورت بزرگ بنویسیم.
نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان C برخلاف بسیاری از زبانهای دیگر به کوچک و بزرگی حروف حساس است (case sensitive). در نتیجه شناسه های زیر با یکدیگر متفاوتند :
Sum ≠ sum ≠ SUM
این مسئله معمولا درهنگام برنامه نویسی باعث ایجاد بعضی خطاها می شود.
آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای منظورهای خاص در زبان C رزرو شده اند استفاده کنید. زبان C دارای 32 کلمه کلیدی است که عبارتند از :
 

auto

break

case

char

Const

continue

default

do

double

Else

enum

extern

float

for

Goto

if

int

long

register

Return

short

signed

sizeof

static

Struct

switch

typedef

union

unsigned

Void

volatile

while

 

 

 

البته در نسخه های جدید C کلمات کلیدی دیگری نیز به لیست فوق اضافه شده است. دقت کنید که کلیه این کلمات با حروف کوچک نوشته شده اند.
انواع داده ها در C

همانطور که قبلا نیز گفتیم هر متغیر پیش از آنکه استفاده گردد ابتدا باید اعلان گردد. اعلان یک متغیر تعیین نوع آن را نیز دربر می گیرد. سوال اصلی آنستکه چه نوع داده هایی در زبان C و جود دارد. انواع داده های متداول عبارتند از :
 

نوع داده

توضیح

اندازه (بیت)

محدوده

char

کاراکتر

8

-128 to +127

int

عدد صحیح

16

-32768 to + 32767

float

عدد اعشاری

32

3.4e-38 to 3.4e+38

double

عدد اعشاری با دقت مضاعف

64

1.7e-308 to 1.7e+308

 
 
البته چند نکته مهم درمورد جدول فوق قابل ذکر است :
- اندازه int در محیطهای 16 بیتی مانند DOS برابر 16 بیت است. اما در محیطهای 32 بیتی همانند Windows اندازه آن 32 بیت می باشد که در اینصورت محدوده ای برابر -2,147,483,647 تا +2,147,483,647 را پوشش می دهد.
- در بعضی از کامپایلرهای C، نوع داده bool نیز وجود دارد که می تواند یکی از مقادیر true(درست) یا false (غلط) را نشان دهد . اما در نسخه های اولیه C از همان نوع داده صحیح یا int برای اینکار استفاده می شد. بدین صورت که 0 نشاندهنده false و هر عدد غیر صفر (معمولا 1) نشاندهنده true است.
- از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد، از یک متغیر کاراکتری یا char می توان بعنوان یک عدد صحیح کوچک نیز استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است.
علاوه براین چندین اصلاح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم.
 این اصلاح کننده ها عبارتند از : short, long, signed, unsigned
تمام اصلاح کننده های فوق می توانند به نوع داده int اعمال شوند و اثر آنها بستگی به محیط دارد. مثلا در یک محیط 16 بیتی، short int بازهم برابر 16 بیت است ولی long int برابر 32 بیت خواهد بود. علاوه براین unsigned int باعث می شود که یک عدد 16 بیتی بدون علامت داشته باشیم که بازه بین 0 تا 65535 را پوشش می دهد. signed int نیز همانند int معمولی بوده و تفاوتی ندارد. البته ترکیب این اصلاح کننده ها نیز ممکن است. مثلا unsigned long int یک عدد 32 بیتی بدون علامت است که بازه 0 تا 4,294,967,295 را پوشش می دهد.
اما برروی نوع داده char فقط اصلاح کننده های signed و unsigned را می توان اعمال کرد. معمولا از اصلاح کننده unsigned وقتی استفاده می شود که قصد داشته باشیم از char بعنوان یک عدد صحیح مثبت بین 0 تا 255 استفاده کنیم.
برروی نوع داده double تنها اصلاح کننده long قابل اعمال است و دراینصورت عدد اعشاری با 80 بیت را خواهیم داشت که قادر است هر عددی در بازه 3.4e-4932 تا 1.1e+4932 را در خود نگاه دارد.
 تعریف متغیرها
برای تعریف متغیرها به شکل زیر عمل می کنیم:
;
که type یکی از نوع داده های گفته شده و variable-list لیستی از متغیرها است که با کاما از یکدیگر جدا شده اند. بعنوان مثال :
int sum;
float average;
long int a, b, c ;
unsigned long int i, j, k ;
علاوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد. مثال :
int d = 0 ;
نكته مهم آنكه زبان C به متغيرها مقدار اوليه نمي دهد (حتي 0) و برنامه نويس خود بايد اينكار را صريحا انجام دهد، درغير اينصورت مقدار اوليه متغير، نامعين خواهد بود.
تعریف متغیرها طبق اصول زبان C میتواند درهرجایی از برنامه صورت پذیرد، و متغیرهای تعریف شده از همان خط به بعد قابل استفاده خواهد بود. اما معمولا توصیه می گردد كه تعریف متغیرها در همان خط ابتدایی تابع و بلافاصله پس از { صورت پذیرد.
 ثوابت
ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد. ثابتها می توانند از هریك از نوع داده های اصلی باشند. برای نمایش هر ثابت بسته به نوع آن عمل می كنیم كه شرح هریك در زیر آمده است :
4
ثوابت عددی صحیح : برای نمایش این دسته از ثوابت، از دنباله ای از ارقام بعلاوه علامت + یا - استفاده می كنیم. بعنوان مثال 45- و یا 3489 ثوابت صحیح هستند. در حالت عادی C هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد. مثلا عدد 85 در یك int قرار می گیرد، اما عدد 145398 در یك long int قرار خواهد گرفت. اما اگر قصد دارید یك عدد كوچك بعنوان long محسوب گردد، می توانید از پسوند L در انتهای آن استفاده می كنیم. مثلا 245L یك عدد long محسوب می شود.
 
long int a = 20L;
ضمن اینكه پسوند U در انتهای عدد نیز نشانه بدون علامت بودن آن است.
نكته دیگر آنكه C به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای 8 یا 16 نیز كه از مبناهای متداول در برنامه نویسی هستند، بنویسید. برای نوشتن عدد در مبنای 8 باید آن را با 0 آغاز كنید، مثلا 0342 یك عدد در منای 8 محسوب می گردد. اما برای نوشتن یك عدد در مبنای 16 باید آن را با 0x آغاز نمایید، مانند 0x27A4.
8
ثوابت عددی اعشاری : برای نمایش اعداد اعشاری، باید از نقطه اعشار استفاده كنیم، مانند 237.45 ، اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد اعشاری استفاده كنید. برای اینكار كافی است از حرف e برای نمایش قسمت توان استفاده نمایید. بعنوان مثال :

-23.47 × 10 5 = -23.47e5
42.389 × 10 -3 = 42.389e-3

دقت كنید كه قسمت توان، حتما یك عدد صحیح است. نكته جالب اینجاست كه برخلاف مورد قبل، كامپایلر بطور پیش فرض داده های اعشاری را از نوع double فرض می كند.چنانچه دوست دارید ثابت شما ازنوع float درنظر گرفته شود، در انتهای آن F قرار دهید. ضمنا پسوند L نیز داده اعشاری را از نوع long double درنظر می گیرد. 10 ثوابت كاراكتری : برای نشان دادن ثوابت كاراكتری، آنها را در داخل ' قرار می دهیم. بعنوان مثال 'A' یك ثابت كاراكتری است.

char ch = 'S' ;

دقت كنید كه همانطور كه قبلا گفته شد، كد اسكی كاراكترها در متغیر ذخیره می گردد، بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد. نكته مهم دیگر آنستكه به تفاوت عدد 5 و كاراكتر '5' دقت داشته باشید. در حقیقت '5' برابر است با عدد 53 كه همان كد اسكی آن است.
از آنجا كه بعضی كاراكترها، مانند enter قابل نمایش نیستند، بهمین دلیل آنها را با استفاده از \ نمایش می دهیم. علاوه براین بعضی كاراكترها مانند خود " نیز چون دارای معنای خاص هستند، باید با استفاده از \ نمایش داده شوند. موارد مهم عبارتند از :

\n خط جدید
\t tab
كاراكتر
\a
بوق كامپیوتر \" "
\' ' \\ \


14 ثوابت رشته ای : C علاوه بر ثوابت فوق، از یك ثابت دیگر بنام رشته نیز حمایت می كند. رشته، دنباله ای از كاراكترها است كه در داخل " قرار می گیرند. بعنوان مثال "this is a test" یك رشته است. دقت كنید كه 'a' یك كاراكتر است، اما "a" یك رشته است كه فقط شامل یك كاراكتر می باشد.

 

نیوتن

 
Description

Isaac Newton

Dansk: Sir Isaac Newton
Français : Newton (1642-1727)
Bahasa Indonesia: Issac Newton saat berusia 46 tahun pada lukisan karya Godfrey Kneller tahun 1689
Lietuvių: Seras Izaokas Niutonas 1689-aisiais
Nederlands: Newton geboren 4 januari 1643
Türkçe: Sir Isaac Newton.
(ö. 20 Mart 1727)

 

 

 

تغییر تاریخ امتحانات

می بینم و یا بهتر بگم می شنوم که همتون شاد و شنگولید

خوب از تعطیلات بین ترمتون لذت ببرید اما اگه بخواید می تونید از سایت دانشگاه تاریخ تغییر امتحانات رو دانلود کنید البته از بخش

News

راستی خوشحال تر باشید چون تاریخ آزمون کارشناسی ارشد هم افتاد از اول تا چهارم اسفند.

پس حالا که یه هفته مونده دختر خانوما و آقا پسرای گل شروع کنید به جمع کردن بقایای بمب انفجاری امتحان تا هفته دیگه خدا بزرگه!!

مژده           مژده

حالا هی بگین سرما بده. برف بده. دلتون همیشه بهار باشه. هیچ وقت زمستونی نباشید. سهراب حق داشت از دستتون دق کنه دیگه. هی گفت باباجون من چشمها را باید شست.

اگه الان برف و بوران نبود که هممون بدبخت می شدیم. 

امتحان های  ترم جاری از یکم بهمن ماه شروع میشه

برید حالشو ببرید. ولی دیگه نشنوم پشت سر برف و سرما بد بگینا.

می خوای بخواه. نمیخوای بخواه

 

 

چند جمله ای نگاری یا  رنگ های خیره کننده ی ریشه های یک چند جمله ای

در طول قرن ها ریاضیدانان روش های گوناگون  حل معادلات را توسعه دادند .با استفاده از ظرفیت های کامپیوتر های امروزی جزئیات این روش ها را کاویدن و از چند و چون این روش ها و اینکه کجا قابل اعتماد هستند ، کجا از دادن جواب باز می مانند  و در چه مواردی بصورت عجیبی عمل میکنند ، اطلاع حاصل کرده اند.

نگاره ای ازچند جمله ای درجه 36
اثر بهمن کلانتری

این کاوش های رایانه ای همچنین توانسته ان دیدی آشکار از روند ریاضیاتی که در پس زمینه جریان دارد را ، به صورت دیداری به ما ارائه کنند.همزمان تعدادی از هنرمندان خوش ذوق هم با بهره گیری از مزایای این روش ها که در به تصویر کشیدن ریاضیات به کار می رود،  به خلق آثار هنری دلفریب و طرح های دلپذیری  زده اند.

یکی از این تلاش ها  نرم افزاری است که اخیرا توسط  کارشناس علوم کامپیوتر آقای بهمن کلانتری از دانشگاه روتگرز(Rutgers ) واقع در نیوجرسی آمریکا ابداع شده این نرم افزار جریان پیدا کردن ریشه های یک چند جمله ای را به قلمرو طرح و هنر می آورد.

حتما می دانید یک چند جمله ای یا پلی نمیال عبارتی است جبری که از توان های مختلف متغیر ها ساخته می شود مانند ،x2 + x – 6 یا  . x3 – 10x2 + x + 3

یک روش برای به تصویر کشیدن این عبارات این است که نمودار این عبارت را رسم کنیم به طور مثال
 
y = x2 + x – 6 ، زمانی که حاصل معادله y برای مقادیر مختلف x محاسبه میشود جفت عددی که بدست می آید برای رسم در دستگاه مختصات دکارتی به کار می رود. که حاصل آن سهمی میشود که محور xها را در دو نقطه 2 و -3 قطع می کند.

ریاضیدانان روش هایی را برای پیدا کردن جواب بدون رسم نمودار و تعیین نقطه برخورد منحنی با محور xها ،ابداع کرده اند. در موارد بسیاری می توان با تکرار گام پایه ای که در این روش ها وجود دارد به تقریب نزدیک و نزدیک تری از این جواب ها رسید.

کلیسا اثر بهمن کلانتری

مشابه این مفهوم برای چند جمله ای های با اعداد مختلط قابل تعمیم است ، همانطور که می دانید اعداد مختلط مانند Z   که به صورت a+ib نوشته می شوند از دو جز a قسمت حقیقی  و bi که قسمت موهومی نامیده می شود ساخته می شوند.زمانی که i ریشه دوم عدد -1 را نشان میدهد . این اعداد  بصورت نقطه هایی بر روی صفحه مختلط قابل ترسیم هستند .زمانی که قسمت حقیقی را به عنوان مختص x و قسمت موهومی را به عنوان مختص y تلقی کنیم بعنوان مثال عدد 3+4i مختصات نقطه(۴و۳) را می دهد.

کلانتری جریان تخمین زدن ریشه های یک چند جمله ای مختلط را به روشی برای خلق طرح های جذاب بدل کرده .او به این کار چند جمله ای نگاری میگوید .او همچنین درباره کاری که انجام میدهد می گوید: "برای بدست آوردن این طرح ها نیازمند استفاده  از هزاران پیکسل روی مانیتور یک کامپیوتر هستیم "

یک چند جمله ای مانند z4 – 1 = 0 به تعداد بزرگترین توانی که z با آن ظاهر می شود ریشه دارد (درجه
چند جمله ای ) . مثلا در این مثال  چهار ریشه داریم .معادله
z17z5 + 6 = 0 ، 17 ریشه خواهد داشت .

با به کار گیری رنگ و تقارن خلق آثاری بدیع از طرحهای تکرار شونده ممکن می شود.
اثر بهمن کلانتری

ایده اصلی در پشت روش های پیدا کردن ریشه ها حدس زدن نقطه ای برای شروع و استفاده از الگوریتم خاصی برای نقطه ای بهتر ، سپس تکرار این روش  با نقطه ی جدید به دست آمده است با این هدف که به ریشه چند جمله ای داده شده نزدیکتر شویم .

در هنگام استفاده از روش های پیدا کردن ریشه ، کسی که معادله را حل می کند انتظار دارد  نقطه شروع انتخابی وی ، او را سریعا به جواب برساند امری که همیشه میسر نمی شود.

این گرافیک کامپیوتری است که با به تصویر کشیدن ماجرا ما را از روند کار مطلع می کند. برای  معادله داده شده کامپیوتر به قصد یافتن جواب روشی مشخص را  برای شمار زیاد از مقادیر Z به کار می گیرد . برای هر کدام از مقادیر اولیه ، کامپیوتر با تعیین کردن مقادیر تخمینی  به سمت ریشه ای که آن مقدار(مقدار اولیه) به سمت آن تمایل دارد حرکت می کند و همزمان رنگ خاصی هم به آن نقطه اختصاص میدهد ، رنگ هر ریشه از ریشه دیگر متفاوت است . مقدار پر رنگی آن نقطه مشخص می کند که با چه سرعتی به سمت ریشه نزدیک  می شود.

حاصل کار پرده ای تابناک است ک اغلب دارای حوضچه های رنگ است. این حوزه های جاذب ( همانطور که کلا نتری آهنها را نامیده است) مکانهای امنی هستند . به این معنی که اگر هر کدام از نقاط شروع از این نواحی انتخاب شوند با تعداد معقول تکرار روش حل معادله، به نزدیکی ریشه ای می رسیم که با یک رنگ خاص مشخصشده .به عنوان مثال معادله:
z4 – 1 = 0 چهار حوزه دارد .

وجود یا عدم وجود (ریشه) در نزدیکی مرز های این حوضچه ها به طور قابل توجهی پیچیده تر می شود بسیار پیچیده تر از یک خط  جدا ساز ساده ، مرز ها معمولا از چرخش های با جزئیات زیاد و گرداب هایی تشکیل می شوند که ممکن است هر لحظه روش تخمین ریشه را به یکی از چهار ریشه z4 – 1 = 0 متمایل کنند.در این باز های در هم تنیده کوچکترین جا به جای در انتخاب نقطه شروع می تواند به سر نوشتی کاملا متفاوت منجر شود.

بسیاری از اثر های کلانتری رنگارنگ و خیال انگیز هستند به طوری که در " مهمانی بر روی پل برکلی " هم دیده  می شود

کلانتری این تکنیک های بصری ریشه یابی را برای خلق آثاری  درخشان ،رنگارنگ ، دلپذیر و زیبا تعمیم داده و هماهنگ کرده ، این تکنیک ها به طور مشخص در کاوش هایش راجع به قلمرو ناشناخته ی چند جمله ای هایی با درجات بالاتر از  10 یا 20به کار گرفته شده.او در این کار از خانواده تابع ها ی تکرار شونده استفاده کرده (تابع های که خودش آنها را خانواده بنیادی می نامد).

نرم افزار کلانتری به شما اجازه می دهد تا یک چند جمله ای را مشخص کنید سپس روش پیدا کردن جواب و بعد رنگ و مقیاس مورد نظرتان را انتخاب کنید.

نگار گران  این چند جمله ای ها می توانند طرح های متنوعی ایجاد کنند . خود کلانتری می گوید " این امر از به کار گیری بینهایت تابع تکرار کننده متنوع  به داخل گونه های متنوع چند جمله ای ها امکان پذیر می شود.تنها چیزی که باقی می ماند انتخاب ناحیه مناسب از تصویر ، رنگ بندی و مقیاس مناسب برای رسیدن به یک منظره دلپذیر است.

"کار کردن با این نرم افزار مانند کار کردن با یک دوربین  فیلم برداری یا یک آلت موسیقی است " این حرف را کلانتری میگوید و تاکید می کند که : " در جریان کار با این نرم افزار یک نفر می تواند خلق آثار ی بدیع و الگو های پیچیده را بیاموزد . این طرح ها در بهترین حالت قابل مقایسه با طرحهای ماهرانه بشری است "

وبسایت کلانتری  وقف به تصویر کشیدن چند جمله ها شده و از آدرس زیر قابل دسترسی است.جایی که شما می توانید طرح های خودتان رو خلق کنید:

http://www.polynomiography.com

نسخه  PDF  پیش از چاپ مقاله او با عنوان " ارتباطی تازه بین ریاضیات و هنر " از آدرس زیر قابل دسترسی است:

http://www.polynomiography.com/images/artmath.pdf

پیوندبه متن اصلی:

http://www.maa.org/mathland/mathtrek_04_21_03.html

 -----------------------------

برگرفته از وبلاگ ریاضیات کاربردی نوشته روزبه ابزاری

در مورد جدول سودوکو          

 

تاريخچه:
سودوکو يا سادوکو  مخفف عبارت ژاپني “Suuji wa dokushin ni kagiru”  به معني عدد هاي بي تکرار است و نوعي جدول اعداد است که امروزه يکي از سرگرمي هاي رايج در کشورهاي مختلف جهان بشمار مي آيد. سودوکو فقط يکي از نامهاي اين بازي است. در آمريكا اين بازي به نام “number place “مشهور است. گفته مي شود که اين بازي ريشه در چين باستان دارد و در قرن ?? ميلادي به اتريش برده شد و بعد از آن به بقيه اروپا و آمريكا راه پيدا کرده، بعد از گذشت زمان هاي طولاني در دهه ي?? ميلادي در مجله هاي تفريحي ظاهر شد. اما در جايي ديگر نيز آمده است که نخستين جدول سودوکو را يک رياضيدان اروپايي در قرن هجدهم طراحي کرده است .


در سالهاي گذشته اين جدول کاربرد عمومي خود را براي سرگرمي  پيدا کرده و خيلي ها را  به خود معتاد کرده است.  اين روزها سودوکو سرگرمي بسياري از مردم جهان شده است، کتاب هاي مجموعه اين جدول ها نيز در نشريات کشورهاي مختلف به چاپ مي رسد و بسياري از روزنامه هاي مترويي در کشور هاي غربي جدول سودوکو را در صفحات سرگرمي خود گنجانده اند. ميزان محبوبيت اين بازي رو به گسترش به ميزاني است که نسخه هاي نرم افزاري اين بازي براي تلفن هاي همراه رواج پيدا کرده و حتي مسابقه هاي تلويزيوني حل سودوکو در کوتاه ترين زمان ممکن به راه افتاده است. اين بازي در نمايشگاه بين المللي بازي و سرگرمي آلمان به عنوان محبوب ترين و پرطرفدارترين بازي شناخته شده است و همچنين قانون بسيار ساده و روشني دارد.

 

image???.jpg

قوانين بازي:    ¼br> سودوکو انواع مختلف ساده ، متوسط ، دشوار و خيلي دشوار دارد و بسته به تعداد خانه هاي خالي دشوارتر مي شود. بازي سودوکو را از سه جنبه مي توان طبقه بندي نمود. يکي از اين جنبه ها مرتبط است با ساختار فيزيکي جدول و تعداد خانه هاي آن که حالات متفاوتي را در بر مي گيرد. مورد ديگر با اعمال قوانين مختلف در بعضي از جداول گوناگون، البته بدون تغيير در قوانين پايه اي و بنيادين اين بازي در ارتباط مي باشد. در نهايت جنبه سوم رتبه بندي اين بازي از درجه آسان تا دشوار مي باشد.
نوع متداول سودوکو در واقع نوعي جدول است که از ? ستون عمودي و ? ستون افقي تشکيل شده و کل جدول هم به ? بخش  کوچکتر تقسيم ميشود.
حالا شما بايد اعداد ? تا ? را در هر يک از جدول هاي کوچکتر بدون تکرار بنويسيد، به صورتي که در هر ستون بزرگتر افقي يا عمودي هيچ عددي تکرار نشود . در واقع هم بايد از تمام اعداد ? تا ? در همه ستون هاي عمودي و افقي استفاده کنيد و هم بايد مراقب باشيد هيچ عددي تکرار نشود و در همه مربع هاي ? ستوني کوچکتر نيز به همين ترتيب همه اعداد ? تا ? بيايد و تکرار نشود. هميشه به عنوان راهنمايي چند عدد در جدول از قبل مشخص ميشود تا بقيه اعداد را شما پيدا کنيد .

روش حل:
ابتدا در تمام خانه هاي خالي جدول، اعداد را از يک تا نه مي نويسيم.
سپس به سراغ يکي از اعدادي که از قبل توسط طراح نوشته شده مي رويم و تمام اعداد مشابه آن را که در عرضش (بصورت افقي )قرار گرفته اند را پاک مي کنيم و سپس يک خط افقي در بالاي آن عدد مي کشيم که مشخص باشد.
در اين مرحله همانند مرحله قبل عمل مي کنيم با اين اختلاف که در تمام خانه هاي عمودي در بالا يا پايين عدد مورد نظر اعداد مشابه را پاک مي کنيم وسپس با يک خط عمودي در کنار آن عدد آن را مشخص مي نماييم .
اکنون بايد اعداد مشابه عدد مورد نظر را در مربع نه خانه اي متناظر، پاک کنيم وعدد را با يک دايره بر دور آن مشخص کنيم.
فقط سه مرحله قبلي را در مورد تمام اعداد از قبل نوشته شده (اعداد چاپي) تکرار کنيم و کشيدن خطهاي عمودي افقي و دايره را بر آن عددها نبايد فراموش کنيم که اين عمل مي تواند به شما نشان دهد که کدام يک از قلم افتاده است.
وقتي که تمام اعداد چاپي با هر سه علامت مشخص شد کار ما تا اين مرحله تمام شده است.
در اين مرحله به دنبال خانه هايي مي گرديم که فقط يک عدد در آنها باقي مانده و آن اعداد را پررنگ مي کنيم.
ما بايد در هر ستون نيز عددي را که فقط يکبار درآن ستون آمده را پيدا کنيم که اين عدد يقينا جواب همان خانه است و اين عدد را هم پررنگ کنيم.
اکنون در هر مربع نه خانه اي عددي را که فقط يکبار در اين نه خانه آمده است را يافته و به عنوان جواب يادداشت مي کنيم

تابع


مفهوم تابع، در سراسر ریاضیات جدید و سایر علوم و در همه سطوح از اهمیت بسزایی برخوردار است. این مفهوم در ابتدا در حساب دیفرانسیل و انتگرال که عمدتاً به مطالعه توابع حقیقی و بررسی حد و مشتق و انتگرال آنها می‌پردازد شکوفا شد.

آنچه ممکن است واژه تابع در ابتدا در ذهن خوانده کم و بیش آشنا با این مفهوم ایجاد کند، عبارتی چون f(x)=x2+sinx و سایر عبارات جبری است(البته به شرط تابع بودن) که عمدتاً بر اعداد حقیقی و یا مختلط تعریف شده‌اند. اما این مفهوم بسیار گسترده تر از این است و این تنها بخش کوچکی از مفهوم تابع است.

در ابتدا مفهوم تابع چندان کلی نبود و اما در ادامه تلاشها برای ارائه تعریف و مفهومی کلی از تابع و گسترش نظریه مجموعه‌ها، مفهومی ساده و کلی از تابع ارائه شد. این کلیت به قدری است که مثلاً برای مطالعه حساب دیفرانسیل و انتگرال باید شرایطی اضافی را بر تابع(مانند پیوستگی و مشتق پذیری) اعمال کرد تا رده خاصی از توابع مورد نظر برای مطالعه حاصل شود.

در بیشتر زمینه‌های ریاضی، اصطلاحات تبدیل و نگاشت نیز معمولاً با تابع هم معنی پنداشته می‌شوند. در هر حال ممکن است که در بعضی زمینه‌های خصوصیات دیگری داشته باشند. برای مثال در هندسه، یک نگاشت گاهی اوقات یک تابع پیوسته تعریف می‌شود.

معرفی مفهوم و بحث غیر رسمی

دو عبارت (y2=x (1 و (2) y=x2 را در نظر بگیرید که در آن x متغیری از اعداد حقیقی است.

در عبارت (1) اگر متغیر x را در عبارت قرار دهیم دو مقدار برای y حاصل می‌شود که عبارت اند از \pm \sqrt{x}، اما در عبارت دوم با قرار دادن مقدار x مقداری یگانه برای y یعنی x2 حاصل می‌شود. به عنوان مثال در عبارت (1) اگر x=2 آنگاه y=\pm \sqrt{2} اما اگر در عبارت (2) قرار دهیم x=2 تنها یک جواب y=4 را بدست می‌آوریم.

اگر متغییر x را ورودی و y مقدار حاصل از قرار دادن متغیر x را در عبارت، خروجی بنامیم و هر یک از عبارات را به عنوان قاعده‌ای بگیریم که هر ورودی x را طبق قانونی مشخص به خروجی y تبدیل می‌کند، می‌توان تفاوت بین دو عبارت را به این صورت بیان کرد که در عبارت (1) برای هر ورودی x، قاعده مربوطه دو خروجی y را ارائه می‌دهد، در صورتی که در (2) برای هر ورودی x قاعده مربوط به آن دقیقاً یک خروجی y حاصل می‌شود.

در هر مورد قاعده را می‌توان یک روش مشخص برای تناظر هر ورودی x به خروجی خودش در نظر گرفت.

رده خاصی از قواعد تناظر وجود دارند که به هر وروی خود یک و فقط یک خروجی نسبت می‌دهند. این نوع از قاعده‌ها از اهمیت خاصی برخوردارند چرا که برای هر ورودی، خروجی آنها یکتا و صریحاً قابل محاسبه و بیان است. چنین قواعدی را در اصطلاح تابع می‌گوییم.

پس بنابر آنچه تا کنون بیان شد یک تابع قاعده‌ای است که هر متغیر دریافتی خود را فقط به یک خروجی نسبت می‌دهد.

شکل(1) نمونه‌ای از یک تناظر که تابع نیست
شکل(1) نمونه‌ای از یک تناظر که تابع نیست
شکل(2) نمونه‌ای از یک تابع
شکل(2) نمونه‌ای از یک تابع

به عنوان مثال تناظر شکل(1) نمایش دهنده یک تابع نمی‌باشد چراکه عضو 3 به دو عضو متناظر شده است. اما شکل(2) نشان دهنده یک تابع است هر چند که دو عضو متفاوت به یک عضو نسبت داده شده‌اند.

حال سعی می‌کنیم تعریفی دقیق و قابل قبول از نظر ریاضی برای این مفهوم پیدا کنیم. در این راه ابتدا نمادگذاری خاصی را معرفی می‌کنیم.

برای نمایش بهتر، تابع که خود یک قاعده برای تناظر است را با f نشان می‌دهیم و ورودی یا شناسه این تابع (قاعده) را با x نشان می‌دهیم که ممکن است عدد هم نباشد. یگانه مقدار خروجی که قاعده f به ورودی x نسبت می‌دهد را بجای y این‌بار با (f(x نشان می‌دهیم و آن را مقدار تابع f در x یا تصویر x تحت تابع f می‌گوییم. همچنین از این پس به قاعده‌ای که هر x را به (y=f(x نسبت می‌دهد ضابطه تابع می‌گوییم.

برای مثال عبارت f(x) = x۲ نشان دهنده ضابطه یک تابع است، که در آن f شناسه x را دریافت می‌کند و آن را به x۲ نسبت می‌دهد. در این صورت برای ورودی ۳ مقدار f(3)=9 به دست می‌آید.

نکته قابل توجه این است که نباید تابع را با ضابطه آن اشتباه کرد. به عنوان مثال در مثال فوق f معرف خود تابع و عبارت (f(x معرف ضابطه تابع است.

همانطور که در ابتدا بیان شد، در یک تابع لزومی ندارد که حتماً بر روی اعداد علمیاتی انجام گیرد. به عنوان مثال تناظری که بین هر فرد و شماره شناسنامه آن وجود دارد نیز نمونه‌ای از توابع است. در ادامه نمونه های بیشتری را از این نوع توابع در ریاضیات خواهید دید.

تا کنون مفهومی جالب توجه به نام تابع پیدا کردیم و به توصیف اجمالی آن پرداختیم. حال با در دست داشتن این مفهوم باید سعی در تعریف دقیق و قابل قبول آن از نظر ریاضی بکنیم.

تابع را به عنوان یک قاعده تناظر تعریف کردیم که به هر عضو ورودی خود یک عضو یگانه را متناظر می‌کند. حال می‌توان همه عناصری را که به عنوان ورودی تابع قرار می‌گیرند در یک مجموعه قرار داد. در اختیار داشتن چنین مجموعه‌ای مفید است و باعث می‌شود متغیرهایی که به عنوان ورودی تابع در نظر گرفته می‌شوند را تعیین کنیم و عناصر اضافه را حذف کنیم. چنین مجموعه‌ای را دامنه تابع می‌گوییم. دامنه تابع f را با domf نشان می‌دهیم. به همین صورت می‌توان مجموعه همه خروجی‌های تابع که تصویر عناصر دامنه هستند را هم در نظر گرفت که به آن برد تابع گفته می‌شود و آن را با ranf یا Imf نشان می‌دهیم. (در خصوص این مفاهیم در ادامه دقیق‌تر بحث خواهد شد.)

حال تابع را می‌توان به عنوان قاعده‌‌ای خاص برای تناظر بین اعضای دو مجموعه دامنه و برد تعریف کرد. به بیان دقیق تر، اگر A و B دو مجموعه باشند، یک تابع از مجموعه A به مجموعه B را می‌توان قاعده‌ای تعریف کرد که به هر عضو مجموعه A چون a یک و فقط یک عضو از مجموعه B را چون (f(a نسبت می‌‌دهد. تابع f از مجموعه A به مجموعه B را با f:A\to B نشان می‌دهیم.

اگر f تابعی از مجموعه A به مجموعه B باشد، A را دامنه f می‌گوییم. اما مجموعه B می‌تواند مجموعه ای بیش از برد تابع باشد. f به هر عضو A یک عضو یکتا از B را نسبت می‌دهد اما تضمینی وجود ندارد که هر عضو مجموعه B الزاماً تصویر یک عضو از A تحت f باشد. پس در حالت کلی برد تابع f زیرمجموعه‌ای از مجموعه B است. مجموعه B را که برد تابع زیرمجموعه‌ای از آن است را همدامنه تابع f می‌گوییم و آن را با codomf نشان می‌دهیم. طبق آنچه بیان شد، برد تابع زیرمجموعه‌ای از همدانه‌اش است. می‌توان دید که برد یک تابع یکتا است ولی همدامنه آن چنین نیست.

به عنوان مثال تابع f:\mathbb{R}\to \mathbb{R} را با ضابطه f(x)=x2 در نظر بگیرید. دامنه این تابع مجموعه اعداد حقیقی است اما آیا برد آن نیز همان مجموعه اعداد حقیقی R است؟ پاسخ آشکارا منفی است چون اعداد حقیقی منفی، چون 1- تصویر هیچ عدد حقیقی تحت f نمی‌باشند. برد این تابع مجموعه اعداد حقیقی نامنفی است که زیرمجموعه‌ای از اعداد حقیقی است.

به نظر می‌رسد بیشتر قسمت‌های تعریف اولیه‌ای که از تابع ارائه دادیم را دقیق نمودیم و آنها را بر پایه مجموعه ها تعریف کردیم. اما نکته‌ای که هنوز در تعریف فعلی ما از یک تابع از مجموعه A به مجموعه B، به عنوان: «قاعده‌ای که به هر عضو مجموعه A یک و فقط یک عضو از مجموعه B را تناظر دهد.»

آزار دهنده و نادقیق است عباراتی چون «قاعده» یا «تناظر» است که از نظر ریاضی نادقیق هستند. چگونه می‌توان این قاعده و بعد از آن تناظری که این قاعده معرف آن است را به طور دقیق فرمول بندی کرد.

فرض کنید f:A→B یک تابع باشد. در این صورت تابع f با انتخاب یک عضو a∈A آن را طبق ضابطه خود به عضو یکتای f(a)∈B متناظر می‌کند. می‌توان هر عضو a را بوسیله زوج مرتب ((a,f(a) به (f(a نسبت دهیم. به این ترتیب، ممکن است معنی دقیق تناظر را ندانیم ولی به نظر طبیعی می‌‌رسد که تناظری که تابع f بین اعضای A و B ایجاد می‌کند را بوسیله زوج های مرتب ((a,f(a) برای هر a∈A تعریف کنیم.

حال تابع f به عنوان قاعده این تناظر، چیزی بجر توصیف نحوه تناظر اعضای A به B نیست که به طور کامل بوسیله همه زوج‌های مرتب ((a,f(a) برای هر a∈A مشخص می‌شود پس تابع f را می‌توان به عنوان مجموعه همه این زوجهای مرتب، یعنی مجموعه همه زوج‌های مرتبی که مولفه اول آنها عضو A بوده و مولفه دوم آنها تصویر مولفه اول تحت تابع f است، تعریف کرد. شرط تابع بودن تضمین می‌کند که هیچ دو زوج متمایزی در تابع f دارای مولفه اول یکسان نخواهند بود.

همچنین از اینجا بنا به تعریف حاصل ضرب کارتی دو مجموعه A و B چون a∈A و f(a)∈B می‌توان نوشت a,f(a))∈A×B). پس تابع f را می‌توان به عنوان زیرمجموعه‌ای از ضرب دکارتی دو مجموعه A و B در نظر گرفت. به عبارت دقیق تر تابع f را می‌توان به عنوان رابطه‌ای دو تایی از A به مجموعه B در نظر گرفت.

در این صورت در تابع f:A→B برای هر a∈A عبارت a,b)∈f) را به صورت (b=f(a نشان می‌دهیم.

حال همه چیز برای ارائه تعریفی دقیق از تابع آماده است.

 بحث رسمی و تعریف دقیق تابع

تعریف
یک تابع از مجموعه X به مجموعه Y رابطه‌ای چون f از مجموعه X به مجموعه Y است که دارای شرایط زیر باشد:
  1. دامنه f مجموعه X باشد، یعنی domf=X.
  2. برای هر x∈X عنصر یگانه y∈Y موجود باشد که x,y)∈f) یا به عبارتی هیچ دو زوج مرتب متمایزی متعلق به f دارای مولفه اول یکسان نباشند. شرط یگانگی را به طور صریح می‌توان یه این صورت فرمول بندی کرد که اگر x,y)∈f) و x,z)∈f) آنگاه y=z.

رابطه‌ای را که دارای چنین شرایطی باشد، تابع خوش تعریف می‌گوییم.

برای هر x∈X یگانه عضو y در Y که به ازای آن x,y)∈f) را با (f(x نشان می‌دهیم. در مورد تابع این علامت گذاری، سایر علامت گذاری‌هایی را که در مورد روابط کلی تر استفاده می‌شوند چون x,y)∈f) یا xfy را متروک ساخته است. از این پس اگر f یک تابع باشد، بجای x,y)∈f) یا xfy می‌نویسیم (y=f(x. عضو y را مقدار تابع به ازای متغیر یا شناسه x، یا تصویر x تحت f می‌گوییم و نیز x را پیش نگاره y می‌گوییم.

کلمات نگاشت، تبدیل، تناظر و یا عملگر نیز برخی از انبوه کلماتی هستند که ممکن است در منابع مختلف بجای تابع بکار بروند اما این عبارات عموماً در برخی حوزه‌ها، بر حالت‌های خاصی از توابع دلالت دارند.

اگر f تابعی از مجموعه X به(در یا به توی) مجموعه Y باشد، این مطلب را به صورت سه تایی (f,X,Y) یا به طور معمول تر برای توابع با f:X→Y نشان می‌دهیم.

 مشخص کردن تابع

برای مشخص کردن یک تابع باید دامنه و ضابطه آن را بشناسیم. منظور از ضابطه یک تابع f:X→Y، فرمول و یا دستوری است که برطبق آن برای هر x∈X، مقدار تابع f در x یعنی (f(x تعیین می‌شود. ضابطه تابع را می‌توان به صورت یک عبارت جبری، مجموعه‌ای از زوج‌های مرتب یا یک رابطه بازگشتی مشخص کرد.

به این ترتیب برای مشخص کردن یک تابع از مجموعه X به مجموعه Y می‌نویسیم f:X→Y و سپس ضابطه آن را ذکر می‌کنیم.

البته گاهی در مواقعی که بیم ابهام نرود دامنه تابع را ذکر نمی‌کنند و به ذکر ضابطه تابع بسنده می‌کنند. مثلاً عرف بر این است که در حساب دیفرانسیل و انتگرال دامنه توابع در صورت ذکر نشدن اعداد حقیقی یا بازه‌ای از اعداد حقیقی باشد.

 دامنه و برد تابع

یک تابع f از مجموعه X به توی مجموعه Y را به عنوان نوعی رابطه از مجموعه X به Y تعریف کردیم. مفاهیم دامنه و برد همانگونه که برای روابط در حالت کلی قابل تعریف‌اند، به طریق اولی برای تابع f نیز قابل تعریف خواهند بود. بنا به تعریف دامنه تابع f که با domf نموده می‌شود، همان مجموعه X است. برد تابع f نیز مجموعه همه عناصری از Y است که تصویر عضوی از X تحت f باشند. برد تابع f را با ranf یا Imf نشان می‌دهیم. بنابه تعریف داریم:

\mbox{ran}f=\{y\in Y:\exists x(x\in X\land y=f(x))\}

اما همانطور که در گذشته نیز اشاره شد و از تعریف فوق نیز قابل برداشت است، برد f در حالت کلی لزوماً برابر مجموعه Y نمی‌باشد بلکه زیرمجموعه‌ای از آن است. برای تمایز بین مجموعه Y و برد تابع f به مجموعه Y همدامنه تابع f می‌گویند و آن را با codomf نشان می‌دهیم و بنا بر آنچه گفته شد، برد تابع زیرمجموعه‌ای از همدامنه‌اش هست.

به عنوان مثال فرض کنید {X={1,2,3 و {Y={a,b,c,d و تابع f:X→Y به صورت {(f={(1,a),(2,b),(3,c تعریف شده باشد. وضوحاً دامنه این تابع مجموعه X است(می‌توان برای تعیین آن مجموعه همه مولفه‌های اول زوج‌های مرتب f را در نظر گرفت) ولی برد آن بنابه تعریف مجموعه {a,b,c} است که آشکارا زیرمجموعه حقیقی Y است.(یعنی زیرمجموعه آن است ولی با آن برابر نمی‌باشد)

در حقیقت برد تابع f مجموعه همه مولفه‌های دوم زوج مرتب‌های f است. مجموعه همه عناصری از Y که به ازای یکx∈X داشته باشیم (y=f(x.

[ویرایش] تساوی دو تابع

فرض کنید f:X→Y و g:Z→W دو تابع باشند. در این صورت تساوی دو تابع f و g را چگونه می‌توان تعریف کرد؟ وضوحاً تساوی f=g، تساوی بین دو مجموعه است و لذا f=g اگر و فقط اگر اعضای f و g یکسان باشند.

این مطلب بسیار موجز است و می‌توان تفسیر زیبایی برای آن انجام داد. این مطلب در درجه اول ایجاب می‌کند که دامنه دو تابع f و g برابر باشند یعنی X=Z. چرا که برای هر x∈X ،x اگر و فقط اگر x,f(x))∈f) و چون f=g اگر و فقط اگر x,f(x))∈g) و این اگر و فقط اگر x∈Z پس X=Z. پس اولین شرط لازم برای تساوی دو تابع تساوی دامنه آنها است.

حال دو تابع f:X→Y و g:X→Z باهم برابرند، یعنی f=g اگر و فقط اگر برای هر x∈X داشته باشیم(f(x)=g(x. به عبارت دیگر اگر f=g در این صورت برای هر x∈X دلخواه و از این پس ثابت، داریم x,f(x))∈f) و چون f=g پس

x,f(x))∈g) و این یعنی (f(x)=g(x. بلعکس فرض می‌کنیم برای هر x∈X داشته باشیم(f(x)=g(x در این صورت، برای هر (x,y)∈f ،(x,y) اگر وفقط اگر (y=f(x و این اگر و فقط اگر (y=g(x پس x,y)∈g) و این یعنی f=g.

بنابر آنچه گفته شد دو تابع f,g باهم برابرند اگر وفقط اگر دامنه‌شان با هم برابر باشد و برای هر x از دامنه مشترکشان، (f(x)=g(x.

به عنوان مثال دو تابع f(x)=\sqrt{x^2} و g(x) = | x | با دامنه اعداد حقیقی باهم برابرند. چرا که اولاً دامنه هر دو آنها اعداد حقیقی R است و برای هر x∈R داریم:

f(x)=\sqrt{x^2}=|x|=g(x)

[ویرایش] تحدید و توسیع

فرض کنید f:X→Y یک تابع و A زیرمجموعه‌ای از X باشد. در این صورت یک روش برای ساختن تابعی چون g از مجموعه A به مجموعه Y این است که برای هر g(x)،x∈A را مساوی (f(x تعریف کنیم. یعنی تابع g:A→Y با ضابطه (g(x)=f(x. بر خواننده است که خوش تعریفی این تابع را تحقیق کند. ممکن است راه دیگری نیز برای بیان این مطلب بیابیم و آن این است که دامنه تابع f را به زیرمجموعه A از X تقلیل دهیم. در این صورت تابعی خواهیم داشت که این بار نه بر روی همه اعضای X بلکه فقط بر روی عناصر زیرمجموعه خاصی از X یعنی A اثر می‌کند و لذا دامنه آن از X به A تغییر می‌یابد. چنین تابعی را که همان g است تحدید تابع f به مجموعه A می‌گوییم و آن را با f|A یا f|A نشان می‌دهیم. با این نمادگذاری داریم g=f|A. همچنین تابع f را توسیع تابع g به مجموعه X می‌گوییم.

بنابراین مفاهیم تحدید و توسیع دو مفهوم متقابل به هم می‌باشند. تحدید یک تابع به زیرمجموعه‌ای از دامنه خود همواره یک تابع است اما توسیع دامنه یک تابع به یک مجموعه جدید که دامنه تابع قبل زیرمجموعه‌ای از آن است همواره تابع نمی‌باشد ولذا در مورد توسیع توابع احتیاط بیشتری لازم است. به طور کلی اگر f:A→Y یک تابع باشد توسیع تابع f به مجموعه X تابعی چون g با دامنه X است، به طوری که تحدید g به مجموعه A برابر تابع f باشد یعنی g|A=f.

هچنین می‌توان همدامنه یک تابع را نیز تحدید کرد البته در این کار احتیاط لازم است، چراکه نباید اعضایی را که متعلق به برد تابع است را حذف نمود. اما اگر f:X→Y یک تابع باشد، با تحدید Y به (f(X که همان برد تابع f است می‌توان تابع (f:X→f(X را تشکیل داد که خواهید دید پوشا نیز هست.

[ویرایش] تصویر و تصویر معکوس

اگر f:X→Y یک تابع و A زیرمجموعه‌ای از X باشد، ممکن است بخواهیم مجوعه‌ای را در نظر بگیریم که عناصر آن تصویر عناصر A تحت f می‌باشند. یعنی مجموعه‌ای که از تاثیر تابع f روی هر عضو مجموعه A حاصل می‌شود. چنین مجموعه‌ای را تصویر یا نگاره A تحت تابع f می‌گوییم و آن را با (f(A نشان می‌دهیم و به این صورت تعریف می‌کنیم:

f(A)=\{f(x):x\in A\}

بنابر این (y∈f(A اگر وفقط اگر به ازای y= f(x)،x∈A یا به بیان نمادین:

y\in f(A)\iff \exists x(x\in A\land y=f(x))

به عنوان مثال اگر {X={1,2,3,4,5 و {Y={a,b,c,d,e و f:X→Y به صورت:

{(f={(1,a),(2,b),(3,c),(4,d),(5,d

تعریف شود و زیرمجموعه A از X به صورت {A={1,3,4 در نظر گرفته شود در این صورت:

{f(A)={f(1),f(3),f(4)}={a,c,d

حال چون X نیز یک زیرمجموعه‌ای از خودش است می‌توان (f(X را نیز تشکیل داد، که در این صورت بنا به تعریف داریم:

f(X)=\{f(x):x\in X\}

که عبارت است از مجموعه همه عناصری از Y است که تصویر عضوی از X تحت f باشند که بنابه تعریف همان برد تابع f یعنی ranf است. به این ترتیب برد f را می‌توان تصویر X تحت تابع f تعریف کرد.

قضیه
اگر f:X→Y یک تابع باشد آنگاه:
  1. f(\varnothing)=\varnothing
  2. \forall x\in X:f\left(\{x\}\right)=\{f(x)\}
  3. اگر A\subseteq B\subseteq X آنگاه f(A)\subseteq f(B)

قضایای فوق به سادگی از تعاریف قابل اثبات می‌باشند. همچنین فرض کنید \{A_i\}_{i\in I} خانواده‌ای از زیرمجوعه‌های X باشد. در این صورت:

  1. f\left(\cup_{i\in I}A_i\right)=\cup_{i\in I}f(A_i)
  2. f\left(\cap_{i\in I}A_i\right)\subseteq \cap_{i\in I}f(A_i)

حال فرض کنید f:X→Y یک تابع باشد و B زیرمجموعه‌ای از مجموعه Y باشد. ممکن است بخواهیم مجموعه همه اعضایی از X را تعیین کنیم که تصویر آنها تحت f عضوی از B باشد.(به شباهت این مطلب با تصویرها توجه کنید) چنین مجموعه ای را با (f-1(B نشان می‌دهیم و آن را تصویر معکوس یا پیشنگاره B تحت تابع f می‌گوییم. و بنابه تعریف داریم:

f^{-1}(B)=\{x\in X:f(x)\in B\}

پس:

\forall x\in X(x\in f^{-1}(B)\iff f(x)\in B)

به عنوان مثال اگر {X={1,2,3,4,5 و {Y={a,b,c,d,e و f:X→Y به صورت:

{(f={(1,a),(2,b),(3,c),(4,d),(5,d

تعریف شود و زیرمجموعه B از Y به صورت {A={a,c,e در نظر گرفته شود در این صورت:

{f-1(B)={1,3

مشاهده می‌کنید که برای عضو e از B عضوی از X وجود ندارد که تصویر آن تحت f برابر e باشد. در حقیقت می‌توان دید که تصویر معکوس B همواره ناتهی نیست، و تنها زمانی ناتهی است که اشتراک B با برد تابع f یعنی (f(X ناتهی باشد.

همچنین وضوحاً Y نیز زیرمجموعه‌ای از خودش است، اگر (f-1(Y را بیابیم خواهیم داشت:

f^{-1}(Y)=\{x\in X:f(x)\in Y\}

که وضوحاً از تعریف تابع این مجموعه برابر X است. پس همواره f-1(Y)=X.

قضیه
اگر f:X→Y یک تابع باشد آنگاه:
  1. f^{-1}(\varnothing)=\varnothing
  2. اگر A\subseteq B\subseteq X آنگاه f^{-1}(A)\subseteq f^{-1}(B)
  3. اگر B,C زیرمجموعه‌هایی از Y باشند آنگاه:
f − 1(CB) = f − 1(C) − f − 1(B)

همچنین فرض کنید \{A_i\}_{i\in I} خانواده ای زیرمجوعه‌های Y باشند. در این صورت:

  1. f^{-1}\left(\cup_{i\in I}A_i\right)=\cup_{i\in I}f^{-1}(A_i)
  2. f^{-1}\left(\cap_{i\in I}A_i\right)= \cap_{i\in I}f^{-1}(A_i)

[ویرایش] اجتماع توابع-توابع چند ضابطه‌ای

بسیار اتفاق می‌افتند که مقدار یک تابع در سراسر دامنه‌اش با یک ضابطه مشخص نمی‌شود مثلاً ممکن است دامنه تابع f که آن را X می‌نامیم را به n مجموعه X1,X2,X3,...,Xn افراز کنیم و تابع f با دامنه X را برای هر x∈Xi به صورت (f(x)=fi(x تعریف کنیم که در آن fi تابعی با دامنه Xi است. همچنین در این صورت می‌توان تابع f را برای هر x از دامنه به صورت زیر نوشت:

f(x)=\begin{cases} f_1(x) &\,x\in X_1\\ f_2(x) &\,x\in X_2\\ \vdots \\ f_n(x)&\, x\in X_n \end{cases}

در این صورت f را تابعی با n ضابطه می‌گوییم.

در مثالی دیگر فرض کنید f:X→Y و g:Z→W دو تابع باشند که برای هر x متعلق به اشتراک X و Y (اشتراک دامنه f,g) داشته باشیم (f(x)=g(x. در این صورت تابع f\cup g:X\cup Z\to Y\cup W اجتماع دو تابع f,g را به صورت زیر تعریف می کنیم:

\left(f\cup g\right)(x)=\begin{cases} f(x)&\, x\in X \\ g(x)&\, x\in Z \end{cases}

برخواننده است که خوش تعریفی این تابع را تحقیق کند. این مفهوم را می‌توان گسترش داد یعنی اگر \{A_i\}_{i\in I} خانواده‌ای از مجموعه‌های دو به دو جدا از هم باشد و برای هر fi,i∈I تابعی با دامنه Ai باشد، می‌توان تابع f، اجتماع توابع fi برای هر i∈I را با دامنه \cup_{i\in I}A_i را به صورت برای هر x از دامنه به صورت

(f(x)=fi(x اگر x∈Ai تعریف کرد. در ادامه نمونه‌هایی از توابع چند ضابطه‌ای را خواهید دید.

[ویرایش] نمودار تابع

شکل(3) نمودار پیکانی یک تابع
شکل(3) نمودار پیکانی یک تابع

منظور از نمودار یک تابع f:X→Y به تصویر کشیدن تناظری است که f بین دو مجوعه X و Y ایجاد می‌کند. برای این کار برای همه روابط و بلاخص توابع عموماً از نمودار پیکانی استفاده می‌شود. برای رسم نمودار پیکانی تابع f:X→Y، دو منحنی بسته، نظیر آنچه در نمودار ون استفاده می‌شود را برای نمایش مجموعه X و Y انتخاب می‌کنیم و عناصر هر یک را بوسیله نقاطی در آنها مشخص می‌کنیم. سپس بین هر عضو x∈X و (f(x یک پیکان از x به (f(x به نشانه تناظر بین آن دو رسم می‌کنیم. به عنوان مثال اگر {X={1,2,3,4,5 و {Y={a,b,c,d,e و f:X→Y به صورت {(f={(1,a),(2,b),(3,c),(4,d),(5,d تعریف شده باشد نمودار پیکانی آن به صورت مقابل است.

شکل (4) نمونه‌ای از نمودار یک تابع حقیقی در دستگاه مختصات دکارتی
شکل (4) نمونه‌ای از نمودار یک تابع حقیقی در دستگاه مختصات دکارتی

این روش گرچه مناسب است ولی برای نمایش همه توابع بویژه توابعی با دامنه اعداد حقیقی(و به طور کلی توابعی که عددی هستند) چندان کاربرد ندارد. اگر f تابعی با دامنه اعداد حقیقی R باشد آن را تابع حقیقی می‌گوییم و برای نمایش نمودار آن از دستگاه مختصات دکارتی استفاده می‌کنیم و روش کار به این صورت است که برای هر x∈R زوج مرتب ((x,f(x) که نماینده نقطه‌ای در صفحه دکارتی است را رسم می‌کنیم و به این ترتیب نمودار تابع f حاصل می‌شود. رسم نمودار تابع، باعث می‌شود دیدی کلی نسبت به آن تابع پیدا کنیم و همچنین بسیاری از خواص مربوط به توابع بویژه توابع حقیقی مانند پیوستگی، مشتق پذیری، نقاط بحرانی و عطف، صعودی یا نزولی بودن و... از روی نمودار آنها قابل تعیین است. به عنوان مثال با بررسی شکل(4) می‌توان گفت این تابع در چه بازه‌هایی صعودی و در چه بازه‌هایی نزولی است، این تابع در سراسر دامنه خود پیوسته و مشتق پذیر است، دارای دو نقطه بحرانی و یک نقطه عطف است و ... .

شکل(6)
شکل(6)

همچنین از روی نمودار یک رابطه می‌توان تابع بودن آن را بررسی کرد. به عنوان مثال نمودار شکل(1) معرف یک تابع نمی‌باشد چون عضو 3 به دو مقدار متناظر شده است. همچنین در نمودار رسم شده در دستگاه دکارتی در شکل مقابل، وضوحاً برای هر عدد حقیقی مثبت x تابع دارای دو مقدار است. به طور کلی یک نمودار در دستگاه مختصات دکارتی یک تابع است اگر هر خط عمودی مرسوم بر محور x ها نمودار را حداکثر در یک نقطه قطع کند.

[ویرایش] تابع یک به یک و پوشا

فرض کنید f:X→Y یک تابع باشد. در اینصورت برای تناظری که بین اعضای X و Y بوسیله تابع f برقرار می‌شود حالات مختلفی را می‌توان تصور کرد.

شکل(7)
شکل(7)

اولین حالت اینکه ممکن است به ازای هر y متعلق به برد تابع f، تنها یک x در دامنه موجود باشد که (y=f(x. این شرط را می‌توان چنین فرمول بندی کرد که اگر به ازای x1,x2∈X داشته باشیم (f(x1)=f(x2 آنگاه x1=x2 یا:

\forall x_1,x_2\in X:(f(x_1)=f(x_2)\Rightarrow x_1=x_2)

چنین تابعی را با این ویژگی یک تابع یک به یک(تک گزین) یا انژکتیو می‌گوییم. یک به یک بودن تابع f را گاهی برای اختصار با نماد 1-1 نشان می‌دهند. در چنین حالتی ضمن اینکه بدلیل تابع بودن f هیچ دو زوج مرتبی از f دارای مولفه اول یکسان نمی‌باشند، به دلیل یک به یک بودن هیچ دو زوج مرتبی از f دارای مولفه دوم یکسان نیز نمی‌باشند.

به عنوان مثال f:RRبه ضابطه f(x)=x2 یک به یک نمی‌باشد چرا که اگر (f(x1)=f(x2 در این صورت x12=x22 اما الزاماً این نتیجه نمی‌دهد x1=x2 پس تابع یک به یک نمی‌باشد.

یک به یک بودن یک تابع از روی نمودار تابع نیز قابل بررسی است. در نمودار پیکانی تابع یک به یک f، وضوحاً به هر عضو از همدامنه f انتهای حداکثر یک پیکان وارد شده است. به این ترتیب نمودار پیکانی شکل(2) نمایش گر یک تابع غیر یک به یک است. همچنین نمودار یک تابع حقیقی یک به یک به گونه‌ای است که هر خط موازی محور x ها، نمودار آن را حداکثر در یک نقطه قطع می‌کند. به این ترتیب نمودار شکل(4) مربوط به تابعی غیر یک به یک است.

همانطور که در گذشته نیز اشاره شد در تابع f:X→Y برد f ممکن است دقیقاً برابر مجموعه Y نباشد، ولی همواره زیرمجموعه‌ای از Y است.

حال اگر برد تابع f برابر مجموعه Y باشد یعنی ranf=Y در این صورت هر عضو Y تصویر یک عضو مجموعه X تحت f خواهد بود. یعنی برای هر y∈Y، عضوی چون x∈X وجود دارد که (y=f(x. در این حالت تابع f:X→Y را تابع پوشا(برو) یا سوژکتیو می‌گویند و به اصطلاح می‌گویند f مجموعه X را بروی Y می‌نگارد.

این نکته بسیار حایز اهمیت است، چرا که در مورد نماد f:X→Y دو عبارت f تابعی از X به توی Y است و f تابعی از X به روی Y است با هم تفاوت دارند و عبارت دوم چیزی بیش از عبارت اول یعنی پوشا بودن تابع f را نیز بیان می‌کند.

پس تابع f:X→Y یک تابع پوشا(برو) است هرگاه:

\forall y\in Y\exists x\in X:y=f(x)

اگر f:X→Y یک تابع غیر پوشا باشد، یک راه برای پوشا کردن تابع f تحدید همدامنه آن به برد f است. به عبارت دیگر می‌توان اعضایی از مجموعه Y(همدامنه) که تصویر هیچ عضوی از X نمی‌باشند(یعنی متعلق به برد تابع نمی‌باشند) را حذف نمود در این صورت تابع f از X به مجموعه تقلیل داده شده تابعی پوشا خواهد بود. مجموعه‌ای که می‌توان Yرا به آن تحدید نمود و تابعی پوشا بدست آور تصویر X تحت f با همان (f(X است که همانطور که در بالا نیز اشاره شد، این مجموعه همان برد تابع است.

بنابر این اگر f:X→Y یک تابع باشد تابع (f:X→f(X تابعی پوشا است و این از تعریف (f(X قابل اثبات است. به عنوان مثال f:RRبه ضابطه f(x)=x2 یک تابع پوشا نمی‌باشد. چرا که اعداد حقیقی منفی در همدامنه f(همان مجموعه R) تصویر هیچ عضوی از دامنه خود نمی‌باشند، چرا که مربع هیچ عدد حقیقی منفی نیست. اما تابع f:RR≥0 یک تابع پوشا است چون برای هر y∈R می‌توان قرار داد x=\sqrt{y}\in \mathbb{R} و داریم f(x)=(\sqrt{y})^2=y و لذا f پوشا است.

شکل(8) نمونه‌ای از یک تابع دوسویی
شکل(8) نمونه‌ای از یک تابع دوسویی

حال که با مفاهیم یک به یک بودن و پوشا بودن آشنا شدیم وضوحاً یک تابع نسبت به دارای بودن این خواص می‌تواند چهار حالت مختلف باشد. یک حالت جالب توجه و بسیار مهم زمانی است که یک تابع هم یک به یک و هم پوشا باشد. چنین تابعی را تناظر یک به یک یا دو سویی یا بیژکتیو می‌گوییم.

به عنوان مثال تابع f(x)=x3 بر مجموعه اعداد حقیقی یک تناظر یک به یک است.

از نمودار پیکانی مقابل می‌توانید ببینید که چنین تابعی دارای چه ویژگی خاصی است. وجود چنین تابعی بین دو مجموعه متناهی ایجاب می‌کند تعداد اعضای آنها با هم برابر باشد. این مطلب در حالت کلی نیز درست است. یعنی اگر تابعی دوسویی بین دو مجموعه(خواه متناهی یا غیرمتناهی) برقرار باشد عدد اصلی آن دو مجموعه با هم برابر است.

از توابع دوسویی برای بسیاری از تعاریف در نظریه مجموعه‌ها مثلاً تشابه مجموعه‌های خوشترتیب یا تعریف همتوانی دو مجموعه استفاده می‌شود.

[ویرایش] مجموعه توابع

اگر X و Y دو مجوعه باشند مجموعه همه توابع از مجموعه X به مجموعه Y را با YX نشان می‌دهیم و بنابه تعریف داریم:

Y^X=\{f|f:X\to Y\}

عدد اصلی این مجموعه را نیز می‌توان به صورت زیر بدست آورد(برای اثبات به مقاله حساب اعداد اصلی رجوع کنید.):

card(YX) = (cardY)cardX

از رابطه فوق نتیجه می‌شود اگر X مجوعه‌ای n عضوی و Y مجموعه‌ای m عضوی باشد تعداد توابع قابل تعریف از مجوعه X به مجموعه Y برابر است با mn که البته برای اثبات این مسئله خاص راه حل ترکیباتی هم وجود دارد. توضیح اینکه اگر بخواهیم تابع f:X→Y را تعریف کنیم هر عضو از n عضو مجموعه X چون x∈X، را می‌توان به m طریق به یک عضو از مجموعه Y نسبت داد. پس بنا بر اصل شمارش تعریف چنین تابعی به mn طریق ممکن خواهد بود.

حال فرض کنید f:X→Y یک تابع باشد و X مجموعه‌ای n عضوی و Y مجموعه‌ای m عضوی باشند.

در این صورت اگر m≥n می‌توان f را به صورت تابعی یک به یک بین دو مجموعه X و Y تعریف کرد. برای این کار کافی است n عضو را از بین m عضو مجموعه Y انتخاب کنیم و بیاد داشته باشید که ترتیب انتخاب اعضا نیز مهم است و لذا تعداد توابع یک به یک قابل تعریف برابر است با جایگشت n شی از m شی که برابر است با:

P(m,n)=\frac{m!}{(m-n)!}

همچنین اگر n≥m، می‌توان f را به صورت تابعی پوشا نیز تعریف کرد که تعداد توابع پوشا از مجموعه X به مجموعه Y برابر است با:

\sum_{k=0}^m(-1)^k{m\choose k}(m-k)^n

که البته اثبات آن بوسیله اصل شمول و عدم شمول انجام پذیر است و بدلیل طولانی بودن از ارائه برهان آن خودداری می‌کنیم. همچنین تعداد توابع دوسویی روی مجوعه n عضوی X برابر است با !n.

[ویرایش] ترکیب توابع

شکل(9) نمودار ترکیب دو تابع
شکل(9) نمودار ترکیب دو تابع

فرض کنید g:X→Y و f:Y→Z دو تابع باشند. در این صورت برای هر x∈X، داریم g(x)∈Y و لذا (g(x در دامنه تابع f قرار می‌گیرد و لذا

f(g(x))∈Z. کاری که انجام دادیم این بود که ابتدا x∈X را توسط تابع g به عضوی از مجموعه Y متناظر کردیم و عضو حاصله در Y را بوسیله تابع f به عضوی از مجموعه Z متناظر کردیم. به این ترتیب می‌توان گفت عضو x را توسط دو تابع g,f به عضوی از مجموعه Z متناظر کردیم. این کار را می‌توان به طور مستقیم نیز انجام داد.

برای این منظور تابع h:X→Z را برای هر x متعلق به مجموعه X، به صورت ((h(x)=f(g(x تعریف می‌کنیم. چنین تابعی را ترکیب تابع g و f می‌گوییم و آن را با fog (بخوانید f اُ g) نشان می‌دهیم.

با توجه به آنچه بیان شد تابع fog را می‌توان به صورت زیر نیز تعریف کرد:

fog = \left\{ {\left( {x,z} \right) \in X \times Y:\exists y\left( {y \in Y \wedge \left( {x,y} \right) \in g \wedge \left( {y,z} \right) \in f} \right)} \right\}

توجه داشته باشید که در حالت کلی ترکیب توابع جابجایی نمی‌باشد یعنی همواره رابطه fog=gof برقرار نمی‌باشد.

به عنوان مثال اگر f:RR با ضابطه f(x)=x3 و g:RR باضابطه g(x)=lnx باشد در این صورت، داریم:

(fog)(x) = f(g(x)) = f(lnx) = (lnx)3
(gof)(x) = g(f(x)) = g(x3) = ln(x)3 = 3lnx
قضیه
ترکیب توابع شرکت پذیر است، یعنی اگر f:A→B,g:B→C,h:C→D سه تابع باشند آنگاه ho(gof)=(hog)of.

برای اثبات توجه می‌کنیم که هر دوی ho(gof),(hog)of توابعی از مجموعه A به توی مجموعه D می‌باشند و برای هر x∈A داریم:

(((ho(gof))(x)=h(g(f(x)

و

(((hog)of)(x)=h(g(f(x))

که این تساوی را توجیه می‌کند.

[ویرایش] معکوس تابع

یادآور می‌شویم که اگر R یک رابطه از مجموعه X به مجموعه Y باشد، آنگاه معکوس رابطه R را با R-1 نشان می‌دهیم که عبارت است از:

R^{ - 1}  = \left\{ {\left( {y,x} \right):\left( {x,y} \right) \in R} \right\}

و این یک رابطه از مجموعه Y به مجموعه X است. حال تابع f:X→Y نیز یک رابطه است و لذا به معکوس آن را نیز می‌‌توان تعریف کرد که آن را با f-1 نشان می‌دهیم و حداقل یک رابطه از Y به X است.

f^{ - 1}  = \left\{ {\left( {f(x),x} \right):x \in X} \right\}

حال این سوال مطح می‌شود که آیا f-1 نیز یک تابع خواهد بود و یا چه هنگامی f-1 یک تابع است؟

وضوحاً برای اینکه f-1:Y→X تابع باشد، باید در شرایط تابع بودن(که در گذشته بیان شد) صدق کند یعنی در درجه اول دامنه‌اش همان مجموعه Y باشد و نیز هر عضو Y را به عضوی یگانه از X تصویر کند.

اما برای اینکه دامنه f-1 برابر مجموعه Y باشد، برد تابع f باید برابر مجموعه Y باشد و این یعنی تابع f باید پوشا باشد.

برای اینکه f-1 هر عضو از دامنه خود Y را به یک عضو یگانه از مجموعه X تصویر کند، باید برای هر x1,x2∈X داشته باشیم اگر (f(x1)=f(x2 آنگاه x1=x2 و این یعنی f باید تابعی یک به یک باشد.

بنابراین معکوس تابع f:X→Y یعنی f-1 تابعی از Y به X خواهد بود اگر وفقط اگر f:X→Y یک دوسویی باشد. در این حالت f-1:Y→X را تابع معکوس تابع f می‌گوییم.

اگر f-1 معکوس تابع f:X→Y باشد رابطه زیر را بین دامنه و برد f و f-1 داریم:

  1. domf − 1 = ranf
  2. ranf − 1 = domf

همچنین اگر (y=f(x پس x,y)∈f) ولذا y,x)∈f-1) پس (x=f-1(y و بلعکس.

رابطه بین یک تابع و معکوسش را می‌توان به این صورت توصیف کرد که تابع f-1 معکوس تابع f، دقیقاً عکس تناظری که تابع f بیانگر آن است را توصیف می‌کند. به همین دلیل و بنابه تعریف تابع معکوس نمودار پیکانی تابع f-1 معکوس تابع f:X→Y با معکوس کردن جهت فلش‌ها بدست می‌آید.

همچنین اگر f تابعی حقیقی باشد، برای اینکه نمودار معکوس f را تعیین کنیم کافی است قرینه نمودار تابع f را نسبت به نیمساز ربع اول و سوم یعنی f(x)=x رسم کنیم و چون انعکاس نسبت به نیمساز ربع اول و سوم موجب جابجایی مولفه‌های اول و دوم زوج‌های مرتب تابع f می‌شود و این در حقیقت همان هدف ماست.

حال اگر f:X→Y تابعی یک به یک و پوشا با معکوس f-1:Y→X باشد، برای هر x∈X داریم:

(fof − 1)(x) = f(f − 1)(x) = x
(f − 1of)(x) = f − 1(f(x)) = x

و این یعنی ترکیب هر تابع با معکوس خودش برابر با تابع همانی است.

[ویرایش] بررسی چند تابع خاص

[ویرایش] تابع ثابت

فرض کنید X و Y دو مجموعه ناتهی و b∈Y عضوی ثابت و لخواه باشد. در این صورت می‌توان تابع f:X→Y را با ضابطه برای هر f(x)=b,x∈X تعریف کرد که به آن تابع ثابت می‌گوییم. وجه تسمیه این تابع نیز واضح است، چرا که به هر عضو دلخواه مجموعه X عضو ثابت b از مجموعه Y را نسبت می‌دهد. این تابع را معمولاً با Cb نشان می‌دهیم و می‌توان به آن را صورت زیر نیز نشان داد:

C_b=\{(x,b):x\in X\}

نمودار یک تابع ثابت روی اعداد حقیقی یک خط موازی محور X‌ها خواهد بود.

[ویرایش] تابع همانی

فرض کنید X یک مجموعه ناتهی باشد. در این صورت بدیهی‌ترین رابطه‌ای که ممکن است روی مجموعه X تعریف کنیم رابطه همانی با انعکاسی است. اگر این رابطه را با I نشان دهیم داریم:

I=\{(x,x):x\in X\}
شکل(10) نمودار تابع همانی روی مجموعه اعداد حقیقی
شکل(10) نمودار تابع همانی روی مجموعه اعداد حقیقی

به سادگی می‌توان دید رابطه همانی روی مجموعه X یک تابع از X به روی خودش است که به آن تابع همانی می‌گوییم. به عبارت دیگر I:X→X با ضابطه برای هر I(x)=x،x∈X تابع همانی است. اگر مجموعه X را مجموعه اعداد حقیقی R در نظر بگیریم، تابع همانی از مجموعه R به روی مجموعه R تابع f(x)=x است که همان نیمساز ربع اول و سوم دستگاه مختصات دکارتی است. به سادگی می‌توان تحقیق کرد این تابع در مجموعه اعداد حقیقی دوسویی است.

حال مجموعه ناتهی X و زیرمجموعه A از آن را در نظر بگیرید. در این صورت بنابه آنچه از قبل گفته شد می‌توان دامنه تابع همانی روی X یعنی I:X→X را مجموعه A تحدید نمود و حاصل تابع I|A:A→X است با ضابطه برای هر I(x)=x،x∈A، این تابع را که زیرمجموعه A از X را به توی X می‌نگارد را تعمیمی بر تابع همانی می‌توان دانست که به آن تابع احتوا یا شمول می‌گویند.

[ویرایش] تابع قدر مطلق

قدر مطلق اعداد حقیقی را می‌توان به عنوان یک تابع در نظر گرفت. این تابع را می‌توان به صورت f:RR تعریف کرد:

f(x)=\begin{cases} x&\,x\ge 0 \\ -x &\, x<0 \end{cases}

قدر مطلق x را معمولا با |x| نشان می‌دهیم. وضوحاً این تابع یک تابع از مجموعه اعداد حقیقی به روی مجموعه اعداد حقیقی نامنفی است.

[ویرایش] تابع علامت

تابع sgn:RR را با ضابطه:

\mbox{sgn}(x)=\begin{cases} 1&\, x>0\\ 0&\, x=0\\ -1&\, x<0 \end{cases}

تابع علامت می‌گویم. نماد sgn کوتاه نوشتی برای sign به معنی علامت است. وجه تسمیه این تابع نیز واضح است، چرا که اعداد را بر حسب علامتشان جدا می‌کند. این تابع نمونه‌ای از توابع چند ضابطه‌ای است.

[ویرایش] تابع انتخاب

برای مطالعه بیشتر به مقالات تابع انتخاب و اصل انتخاب مراجعه کنید.

در نظریه اصل موضوعی مجموعه‌ها اصلی موضوعی موسوم به اصل موضوع انتخاب بیان می‌کند برای هر دسته ناتهی \mathcal{C} از مجموعه‌های ناتهی، تابعی چون f:\mathcal{C}\to \cup \mathcal{C} وجود دارد که بری هر A\in \mathcal{C} داریم f(A)\in A این تابع را تابع انتخاب می‌گوییم.

اجمالاً تابع انتخاب، انتخاب‌های همزمان از اعضای دسته \mathcal{C} انجام می‌دهد و اعضای انتخاب شده را در برد خود قرار می‌دهد.

نکته‌ای که جالب و جنجال بر انگیز است این است که تنها وجود این تابع بوسیله اصل موضوع انتخاب تضمین می‌شود حتی اگر تعداد مجموعه‌های دسته مفروض \mathcal{C} نامتناهی باشد، و هیچ روشی برای نحوه این انتخاب ارائه نمی‌کند به عبارت دیگر برای این تابع ضابطه‌ای در نظر نمی‌گیرد. این تابع به ما امکان انتخاب‌های نامتناهی را هم می‌دهد که این امر برای اثبات بسیاری از قضایای نظریه مجموعه‌‌ها، خصوصاً قضیه خوشترتیبی و لم زرن لازم است.

[ویرایش] تابع مشخصه

شکل(11) نمودار پیکانی تابع مشخصه A در X
شکل(11) نمودار پیکانی تابع مشخصه A در X

فرض کنید X مجموعه‌ای ناتهی و A زیرمجموعه‌ای از X باشد. در این صورت تابع مشخصه A در X، یعنی \mathcal{\chi}_A:X\to \{0,1\}(بخوانید خی A) را برای هر x∈X به صورت زیر تعریف می‌کنیم:

\mathcal{\chi}_A(x)=\begin{cases} 1 &\ x\in A \\ 0 &\ x\in X-A \end{cases}

البته انتخاب مجموعه {0,1} هر چند معمول‌تر است ولی الزامی نیست و می‌توان هر مجموعه دو عضوی دیگر را نیز انتخاب کرد. این تابع به هر عضو مجموعه A عدد یک و به هر عضو X-A یعنی عناصری که متعلق به X هستند ولی به A تعلق ندارند مقدار صفر رانسبت می‌دهد. وجه تسمیه این تابع این است که عناصری زیرمجموعه A از X را از سایر عناصری که در A قرار ندارند جدا می‌کند.

نمونه‌ای از یک تابع مشخصه معروف تابع دیریکله است که همان تابع مشخصه Q(اعداد گویا) در R(اعداد حقیقی) است که آن را با D نشان می‌دهیم و به این صورت تعریف می‌کنیم:

D(x)=\begin{cases} 1 &\ x\in \mathbb{Q} \\ 0 &\ x\in \mathbb{R}-\mathbb{Q} \end{cases}

به سادگی می‌توان نشان داد این تابع هر هیچ نقطه از دامنه خود پیوسته نمی‌باشد.

[ویرایش] توابع دو (یا چند) متغیره

عباراتی چون f(x,y) = sin(xy) یا f(x,y,z) = x2 + y2 + z2 را در نظر بگیرید. هر یک از آنها دو یا بیش از دو متغییر از دامنه می‌پذیرند و یک مقدار یگانه را به همه آنها نسبت می‌دهند. گاهی ممکن است تابع بجای یک شناسه دو یا چند شناسه را به بپذیر و آنها را به یک عضو از برد خود نسبت دهد، در این صورت تابع را دو یا چند متغیره می‌گوییم. چنین توابعی رابطه‌ای بین بیش از دو مجموعه هستند. به عنوان مثال تابع اول را می‌‌توان تابعی به صورت f:R×RR توصیف کرد که در این صورت تابع زوج (x,y) را به عنوان شناسه خود می‌پذیرد و آن را به عضوی از R نسبت می‌دهد که در این صورت اعضای تابع f را می‌توان به صورت سه تایی ((x,y,f(x,y) نشان داد.

[ویرایش] عمل دوتایی

برای مطالعه بیستر به مقاله عمل دوتایی مراجعه کنید.

نمونه ای از پرکاربرد ترین توابع چند متغیره، عمل دوتایی است. یک عمل دوتایی روی مجموعه A تابعی است چون f:A×A→A که به هر عضو (a1,a2) از A×A عضو یگانه‌ای چون f(a1,a2)=a3 را نسبت می‌دهد.

اعمال ساده‌ای چون جمع و ضرب اعداد نمونه‌ای از دو عمل دوتایی هستند. چنین تابعی دو عضو(نه لزوماً متمایز) از مجموعه A را دریافت می‌کند و آن را به عضوی دیگر از مجموعه A نسبت می‌دهد. این خود نوعی ترکیب یا عمل روی اعضا را در ذهن تداعی می‌کند. در مورد یک عمل دوتایی برای نماشی بهتر از نمادگذاری خاصی استفاده می‌شود. یک عمل دوتایی روی مجموعه A را معمولاً با *,° و گاهی با نماد‌های + و . نشان می‌دهیم. در این صورت عمل دو تایی روی مجموعه A تابعی چون A×A→A:* خواهد بود. همچنین حاصل تابع * را به ازای (a1,a2) از A×A بجای (a1,a2)* با a1*a2 نشان می‌دهیم.

[ویرایش] دنباله

برای مطالعه بیستر به مقاله دنباله مراجعه کنید.

هر دنباله تابعی با دامنه اعداد طبیعی چون f:\mathbb{N}\to A که A مجموعه‌ای دلخواه است. یک دنباله‌ صرفاً اعضای A را بوسیله اعداد طبیعی شماره گذاری می‌کند پس در مورد یک دنباله آنچه مهم است معمولاً برد دنباله است و اعداد طبیعی صرفاً جهت شماره گذاری یا اندیس گذاری استفاده می‌شوند. در این حالت است که نمادگذاری دچار تغییر می‌شود. برای هر عدد طبیعی n، مقدار دنباله f را در n بجای (f(n با fn نشان می‌دهیم و به آن جمله nام دنباله می‌گوییم. خود دنباله را با {fn} نشان می‌دهیم. دنباله نیز به عنوان یک تابع دارای ضابطه است که به آن جمله عمومی دنباله می‌گوییم.

[ویرایش] توابع حقیقی و مختلط

هر تابع با دامنه اعداد حقیقی را یک تابع حقیقی می‌گوییم. حساب دیفرانسیل و انتگرال بخشی از ریاضیات است که بر اساس توابع حقیقی شکل گرفته است و به مطالعه توابع حقیقی و خواص آنها می‌‌پردازد که البته در این بین توابعی حقیقی پیوسته و مشتق پذیر از اهمیت بیشتری برخوردارند چرا که نوعی خوشرفتاری در آنها دیده می‌شود. منظور از خوشترفتار بودن این است که رفتار آنها قابل پیش‌بینی بوده و از قوانین و قضایای خاصی چون قضیه مقدار میانی یا میانگین و... پیروی می‌کنند. چنین توابعی در اکثر بخش‌های ریاضی بویژه آنالیز ریاضی و علوم کلیه مهندسی و کامپیوتری مورد استفاده قرار می‌گیرند.

همچنین ممکن است تابع را بر مجموعه اعداد مختلط در نظر بگیریم که در این صورت توابع حاصله را تابع مختلط می‌گوییم. این توابع بویژه در مطالعه هندسه فراکتال‌ها، و علوم مهندسی چون طراحی مدارات و سیستم‌های مختلف الکترنیکی و مخابراتی کاربرد بسیار فراوان دارند. همچینین در رایاضیات شاخه‌ای از آنالیز ریاضی به نام آنالیز مختلط به بررسی این توابع می‌پردازد.

در زیر فهرستی بیشتر در مورد مطالب مربوط به توابع حقیقی یا مختلط مشاهده می‌کنید:

[ویرایش] پیشینه تابع

«تابع»، به عنوان تعریفی در ریاضیات، توسط گاتفرید لایبنیز در سال ۱۶۹۴، با هدف توصیف یک کمیت در رابطه با یک منحنی به وجود آمد، مانند شیب یک نمودار در یک نقطه خاص. امروزه به توابعی که توسط لایبنیز تعریف شدند، توابع مشتق‌پذیر می‌گوییم، اغلب افراد در هنگام آموختن ریاضی با این گونه توابع برمی‌خورند. در این گونه توابع افراد می‌توانند در مورد حد و مشتق صحبت کنند. چنین توابعی پایه حساب دیفرانسیل و انتگرال را می‌سازند.

واژه تابع بعدها توسط لئونارد اویلر در قرن هجدهم، برای توصیف یک عبارت یا فرمول شامل متغیرهای گوناگون مورد استفاده قرار گرفت، مانند f(x) = sin(x) + x۳.

در طی قرن نوزدهم، ریاضی‌دانان شروع به فرمول بندی تمام شاخه‌های ریاضی براساس نظریه مجموعه‌ها کردند. وایراشتراس بیشتر خواهان به وجود آمدن حساب دیفرانسیل و انتگرال در علم حساب بود تا در هندسه، یعنی بیشتر طرفدار تعریف اویلر بود.

در ابتدا، ایده تابع ترجیحاً محدود شد. ژوزف فوریه مدعی بود که تمام توابع از سری فوریه پیروی می‌کنند در حالی که امروزه هیچ ریاضی‌دانی این مطلب را قبول ندارد. با گسترش تعریف توابع، ریاضی‌دانان توانستند به مطالعه «عجایب» در ریاضی بپردازند از جمله تابعی که بوسیله وایراشتراس معرفی شد که در سراسر دامنه خود پیوسته ولی در هیچ نقطه‌ای مشتق‌پذیر نبود. کشف چنین توابعی موجب شد تا توابع تنها به توابع پیوسته و مشتق‌پذیر محدود نشوند.

تا انتهای قرن نوزدهم ریاضی‌دانان سعی کردند که مباحث ریاضی را با استفاده از نظریه مجموعه‌ها فرمول‌بندی کنند و آنها در هر موضوع ریاضی به دنبال تعریفی بودند که براساسنظریه مجموعه‌ها و نتایج آن باشد. دیریکله و لوباچوسکی هر یک به طور مستقل و تصادفاً هم زمان تعریف «رسمی» از تابع ارائه دادند.

در این تعریف، یک تابع حالت خاصی از یک رابطه است که در آن برای هر مقدار اولیه یک مقدار ثانویه منحصر به فرد وجود دارد.

تعریف تابع در علم رایانه، به عنوان حالت خاصی از یک رابطه، به طور گسترده‌تر در منطق و علم تئوری رایانه مطالعه می‌شود.

[ویرایش] توابع در سایر علوم

مفهوم تابع در همه علوم کاربرد فراوان دارد. برای مثال در فیزیک، هنگامی که می‌خواهیم رابطه بین چند متغیر را بیان کنیم، مخصوصاً در زمانی که مقدار یک متغیر کاملاً وابسته به متغیر دیگر است. برای مثال وقتی که می‌خواهیم نشان دهیم که تغییر دمای آب چه تاثیری بر روی چگالی آن می‌گذارد.

توابع در علوم مختلف بیشتر نه به عنوان چیزی که هست، بلکه به عنوان چیزی که کاری را انجام می‌دهند مورد توجه هستند. در این دیدگاه توابع به عنوان عملگرهای در نظر گرفته می‌شوند که کاری را بر روی ورودی‌های خود انجام می‌دهند. توابع را همچنین مورد استفاده در علم رایانه برای مدل‌سازی ساختمان داده‌ها و تاثیرات الگوریتم می‌بینیم.

[ویرایش] جستارهای وابسته

[ویرایش] منابع

  • Lawrence S. Husch (۲۰۰۱). Visual Calculus. University of Tennessee.
  • João Pedro da Ponte (۱۹۹۲). The history of the concept of function and some educational implications. The Mathematics Educator ۳(۲), ۳-۸. available online in Microsoft Word and HTML formats.
  • Anton, Howard (۱۹۸۰). Calculus with analytical geometry.. New York:John Wiley and Sons. ISBN ۰-۴۷۱-۰۳۲۴۸-۴.
  • ایان استیوارت،دیوید تال. مبانی ریاضیات. ترجمهٔ محمد مهدی ابراهیمی. تهران: مرکز نشر دانشگاهی، 1376، ISBN 964-01-0253-9. ‏
  • شووینگ تی.لین و یو-فنگ. لین. نظریه مجموعه‌ها و کاربرد آن. ترجمهٔ عمید رسولیان. تهران: مرکز نشر دانشگاهی، 1384، ISBN 964-01-0462-0. ‏

بدون فرمول ریاضی


قضیه چهاررنگ

 الگو گسترش
مثالی از یک "نقشه" چهاررنگ
مثالی از یک "نقشه" چهاررنگ

قضیه چهاررنگ یا حدس چهاررنگ از مسائل مشهور و قدیمی ریاضیات است که سال‌ها اثبات نشده مانده بود. به بیان ساده (و نادقیق) این قضیه می‌گوید:

برای رنگ کردن هر نقشه به طوری که کشورها و نواحی همسایه در نقشه هم‌رنگ نباشند فقط چهار رنگ کافی است.

این مسله به صورت معادل ابتدا درسال۱۸۵۲ عنوان شدو سرانجام در سال ۱۹۷۶ با کمک رایانه توسط کی اپپل و و.هیکن حل شد. این اثبات 4 سال طول کشید که بر اساس توضیح پیچیده ای از اثبات قضیه 5 رنگ به کار رفت. که با دسته بندی بیش از چند میلیون گراف به این نتیجه رسیده اند

بنده موفق به ارائه الگوریتم با پییدگی o(n7) براي اين مسئله شده ام. در مورد نحوه ثبت این یافته به اطلاعاتای نیاز دارم.jrezaieb@gmail.com این الگوریتم گراف مورد نظر را رنگ آمیزی می کند

حدس گلدباخ(2)

حدس گلدباخ در ریاضیات یکی از قدیمی‌ترین مسائل حل نشده نظریه اعداد است. این حدس می‌گوید:

هر عدد زوج بزرگ‌تر از ۲ را می‌توان به صورت حاصل‌جمع دو عدد اول نوشت.

مثال: ۲۰=۱۷+۳ یا ۱۰=۷+۳ و ۴=۲+۲ و ۱۲=۷+۵ .

این مسئله در حدود 260 سال پیش توسط یک پزشک آلمانی علاقه مند به اثبات قضیه های ریاضی مطرح شد. شهود این پزشک متوجه حقیقت جالبی شده بود و آن هم این بود که هر عدد زوج را می توان به صورت مجموع دو عدد اول نوشت. (البته عدد یک را به این خاطر از مجموعه اعداد اول کنار گذاشتند که صورت مسئله های نظریه اعداد کوتاه تر شود. زیرا اگر این کار را نمی کردند بایستی در اکثر صورت مسئله های مربوط به اعداد اول می نوشتند: "به غیر از یک") اکنون به دلیل همین موضوع عدد 2 از حدس گلدباخ خارج شده است. گلدباخ هم عصر با اویلر بود. پس از تلاش فراوان و نا امید شدن از اثبات این حدس، گلدباخ از اویلر خواست تا مسئله را برایش حل کند. اویلر یکی از برجسته ترین شخصیت های ریاضی آن زمان بود. نه اویلر و نه هیچیک از شاگردانش نتوانستند این مسئله را حل کنند. تا اینکه حدود 6 سال پیش یک موسسه انتشاراتی در انگلستان به نام "تونی سیبر" برای کسی که بتواند این مسئله را حل کند مبلغ یک میلیون دلار جایزه تعیین کرد. این مسئله در عین سادگی صورت آن، هنوز حل نشده تا بتواند به عنوان قضیه مطرح شود. این حدس توسط کامپیوترهای پیشرفته برای اعداد زوج بسیار بسیار بزرگی تست شده و جالب اینست که تا کنون هیچ مثال نقضی برای آن یافت نشده است. گاهی اوقات فاصله شهود انسان تا لحظه اثبات یک مسئله آنقدر زیاد می شود که نسلها می آیند و می روند ولی همچنان حقیقت درباره مسئله ای مانند حدس گلد باخ نامشخص می ماند. شاید حل نشدن این مسئله به این خاطر باشد که با اعداد اول سر و کار دارد. زیرا خود مجموعه اعداد اول نیز ساختار جبری معینی ندارد. در سال ۱۷۴۲ گلدباخ طی نامه ای به اویلر می نویسد: ” به نظر می رسد که هر دو عدد زوج بزرگتر از ۲ را بتوان به صورت مجموع دو عدد اول نوشت.” این ادعای گلدباخ به حدس گلدباخ شهرت یافت و در این دو نیم قرن اخیر پایه و موضوع تحقیقات گسترده ای شده است.هاروی ریاضیدان برجسته انگلیسی تصریح می کند که حدس گلدباخ یکی از دشوارترین مسائل حل نشده ریاضیات است.

حدس گلدباخ: هر عدد صحیح زوج بزرگتر از ۲ را می توان به صورت مجموع دو عدد اول نوشت.

محاسبات عددی درستی این حدس را نشان می دهند كه به طرق متعددی می توان اعداد زوج را به صورت مجموع دو عدد اول نوشت. در سال ۱۹۷۳ چن نشان داد که اعداد زوج به اندازه کافی بزرگ را می توان به صورت p+m نوشت كه در آن p عددي اول و m عددي اول يا حاصل ضرب دو عدد اول است. گلدباخ حدس زد كه هر عدد فرد بزرگتر از ۷ را مي توان به صورت مجموع سه عدد اول نوشت.هر چند كه اين مساله هنوز باز است اما وينوگراف در سال ۱۹۳۷ نشان داد كه همه اعداد فرد مثبت بزرگتر از ۳۳۱۵ را مي توان به صورت مجموع سه عدد اول نوشت. اما از لحاظ تئوري نتايج بايد روي همه اعداد فرد مثبت مورد بررسي قرار گيرد.


قضیه حد مرکزی

به صورت حسی، قضیه حد مرکزی می گوید که یک سری از چند متغیر تصادفی مستقل با توزیع یکسان به سمت یک متغیر تصادفی مشخص میل می کند. وقتی صحبت از قضیه حد مرکزی می شود معمولا منظور قضیه زیر است:

دنباله ...,X1,X2,X3 از متغیرهای تصادفی مستقل با توزیع یکسان D را که بر یک فضای احتمال تعریف شده اند در نظر بگیرید. فرض کنید میانگین D برابر m و انحراف از معیار آن σ است. حالا سری Sn = X1+X2+X3+...+Xn را در نظر بگیرید. می دانیم که میانگین Sn برابر nm و انحراف از معیار آن \sigma\surd n است. بر اساس قضیه حد مرکزی Sn در بی نهایت به سمت توزیع نرمال (N(nm,σ2n میل می کند.

فرما و آخرین قضیه ی او

پیر دو فرما در سال 1665 میلادی درگذشت. امروز او بیشتر در حوزه ی نظریه اعداد شهرت دارد. این نکته بسیار جالب توجه است که فرما یک حقوقدان بوده. همچنین در طول حیات خود فقط یک مقاله ریاضی در سال 1660 منتشر کرده است.

پس از درگذشت فرما، فرزندش ساموئل کار انتشار آثار او را به عهده گرفت. ساموئل، ضمن جمع آوری نوشته های پدرش، کتابها و مقالات مورد مطالعه وی را نیز بررسی نمود و همین امر باعث انتشار قضیه معروف فرما شد. او دریافت که پدرش، 48 نظر تحت عنوان «نظریات روی کتاب دیوفانتس» نوشته است. در هشتمین مساله، آنچه که بعدها به آخرین قضیه فرما مشهور گردید، بیان شده بود. این مساله به زبان نمادین به این صورت است:

برای هر عدد صحیح n>2 معادله ی فاقد جواب صحیح مثبت است.

فرما ادعا کرده بود که روشی شگفت انگیز برای اثبات این مطلب یافته است، اما حاشیه کتاب باریکتر از آن است که آن را در خود جای دهد!

هر حدس یا قضیه ی دیگری که فرما به این روش اعلام کرده بود تا سال 1847 اثبات شد، مگر آخرین آنها که همین قضیه باشد.

اکنون که بیش از سه قرن از درگذشت فرما می گذرد، کارهای او در غیر از نظریه اعداد، اهمیت خود را در ذهن افراد از دست داده است. البته دلیل این مطلب آن است که کارهای وی قدمهای اولیه ی اساسی در توسه ی نظریات مهمی بوده که امروزه کاملا فهمیده شده اند و به راحتی با زبان نمادین ریاضی –که در زمان فرما موجود نبوده- قابل بیانند. علاقه عمیق فرما به نظریه اعداد از گفته ی وی که مطالعه خواص اعداد صحیح مثبت، بزرگترین عرصه قدرت نمایی استدلال ریاضی محض و بزرگترین گنجینه حقایق ریاضی محض است پیداست.

 قضیه فرما، پیش از قرن بیستم – میدانهای اقلیدسی اعداد

در 4 آگوست 1753 اویلر در نامه ای به گلدباخ، ادعا کرد که قضیه فرما را در حالت N=3 ثابت کرده است. البته اثلات وی اشتباه جالبی داشت. او به دنبال یافتن مکعب هایی از فرم بود...

فرد دیگری که قدمی به جلو برداشت، سوفی ژرمن بود. او نشان داد که اگر n و 2n+1 اعداد اولی باشند، آنگاه ایجاب می کند که یکی از x،y یا z بر n بخشپذیر باشد. بنابراین قضیه آخر فرما به دو حالت زیر تفکیک می شود:

(1) n هیچیک از x و y و z را نمی شمارد.

(2) n یکی از x و y و z را می شمارد.

سوفی ژرمن حالت (1) را برای هر >100 ثابت کرد و لژاندر روش وی را به همه ی اعداد کوچکتر از 197 گسترش داد. حالت (2) برای n=5 به دو بخش تقسیم شد و بخشی را دیریکله در جولای 1825 و حالت دیگر را لژاندر در سپتامبر 1825 ثابت کرد.

در سال 1832 دیریکله اثباتی از قضیه فرما را برای n=14 منتشر کرد. حالت n=7 در 1839 توشط لامه ثابت شد.

سال 1847 در مطالعه قضیه فرما اهمیت زیادی داشت. در اول ماه مارس 1847 لامه ادعا کرد که قضیه آخر فرما را ثابت کرده است. این ادعای لامه عملا منجر به پیشرفتهایی در مبحث میدانهای اقلیدسی اعداد شد.

 قضیه فرما در قرن بیستم

با وجود جوایزی که برای حل مساله فرما گذاشته شده بود، این قضیه، همچنان حل نشده باقی ماند و رکورددار بیشترین اثباتهای غلط شد. مثلا بیش از 1000 اثبات غلط در بین سالهای 1908 تا 1912 منتشر گردید.

کومر با معرفی مفاهیم عمده ای در نظریه اعداد مانند اعداد سیکلوتومیک، یکتایی تجزیه و عدد رده ای توانست قضیه فرما را برای n های اول کمتر از 100 بجر 37 و 56 و 67 – که به اصطلاح اعداد نامنظم (irregular) بین یک و صد نامیده می شوند – ثایت کند. در سال 1857 کومر قضیه فرما را برای این اعداد نیز ثابت کرد. البته اثبات او نقص هایی داشت که در سال 1920 ون دیور آنها را برطرف نمود.

نتیجه های فوق برای n های خاص بوده است. در این باره تا سال 1992 درستی آخرین قضیه فرما برای همه ی اعداد اول >4000000 به کمک کامپیوتر بدست آمد.

اولین کار عمده برای n دلخواه، در قرن بیستم، در اوایل دهه 1980 توسط فالتینگز انجام شد. وی حدس موردل را که در سال 1922 مطرح شده بود ثابت کرد. این حدس به قرار زیر است:

تعداد نقاط گویا روی یک منحنی با ضرایب گویا و گونای بزرگتر یا مساوی دو، متناهی است.

علت ارتباط این مساله با قضیه ی فرما این است که هر جواب صحیح و غیر صفر مانند x و y و z برای معادله ی متناظر است با یک نقطه با مختصات گویا روی منحنی و برعکس.

اما این ارتباط در نهایت حاصلی برای اثبات قضیه آخر فرما نداشت. البته اثبات حدس موردل توسط فالتینگز با معرفی ایده های جدیدی همراه بود که باعث توسه ی مفاهیم اساسی در هندسه جبری حسابی گردید.

 فصل آخر داستان

فصل پایانی داستان قضیه آخر فرما در سال 1955 آغاز گردید. یوتاکا تانیاما آغازگر این حرکت اساسی بود. وی در سال 1927 در منطقه ای در شمال توکیو متولد شد و در سال 1953 از دانشگاه توکیو در «نظریه جبری اعداد» فارغ التحصیل گردید. او کتاب «نظریه اعداد مدرن» را همراه شیمورا در سال 1957 نوشت. با اینکه آینده ی بزرگی، به ویژه از نظر علمی برای تانیاما متصور می شد، او در روز 17 نوامبر 1958 در توکیو خودکشی کرد. تانیاما به عنوان دلیل خودکشی خود نوشته است:

   
قضیه آخر فرما

تا دیروز دلیلی قطعی برای کشتن خود نداشتم... خودم هم نمی فهمم، اما این نتیجه ی اتفاق یا موضوع خاصی نیست.

   
قضیه آخر فرما


حدود یک ماه بعد دختری که تانیاما قصد ازدواج با او را داشت نیز خودکشی کرد!

تانیاما سوالاتی درباره ی خمهای بیضوی – یعنی خم هایی بفرم پرسید. کارهای بیشتر که در این زمینه توسط ویل و شیمورا انجام شد، حدسی را بوجود آورد که به حدس شیمورا-تانیاما-ویل مشهور گردید. این حدس حاکی است که هر خم بیضوی را که بر اعداد گویا تعریف می شود، می توان به وسیله ی توابع پیمانه ای بیضوی، پارامتری کرد.

در سال 1986، ارتباطی بین حدس شیمورا-تانیاما-ویل و قضیه ی آخر فرما توسط فری و سر ایجاد شد. در همهن دهه دهه کن ریبت، بر اساس کارهای انجام شده توسط سر، نشان داد که قضیه آخر فرما از حدس شیمورا-تاناما-ویل نتیجه می شود.

 اندر وایلز و اثبات قضیه آخر فرما

اندر جان وایلز (Andrew John Wiles) در 11 آوریل 1953 در کمبریج انگلستان به دنیا آمد. علاقه ی او به قضیه ی فرما زمانی که او کودکی ده ساله بود شکب گرفت. او در این باره می گوید:

   
قضیه آخر فرما

من ده ساله بودم که روزی در کتابخانه ای عمومی یک کتاب ریاضی پیدا کردم. در این کتاب مطالب تاریخی بسیاری درباره ی مساله ای آمده بود. من در حالی که فقط ده سالم بود، صورت آن مساله را فهمیدم و سعی کردم آن را ثابت کنم. مساله ی جالبی بود. این مساله همان قضیه ی آخر فرما بود!

   
قضیه آخر فرما


وایلز درجه دکترای خود را از دانشگاه کمبریج دریافت نمود. استاد راهنمای وی در کمبریج جان کوتز بود. وی درباره ی وایلز گفته است:

   
قضیه آخر فرما

«من از داشتن دانشجویی مثل اندرو خیلی خوشحال بوده ام. او ایده های عمیقی در تحقیقات داشت و همیشه واضح بود که ریاضیدانی خواهد شد که کارهای بزرگی انجام می دهد!

   
قضیه آخر فرما


اندرو وایلز در دهه 1980 به دانشگاه پرینستون رفت. وی پس از شروع کار روی قضیه فرما تقریبا تحقیقات دیگرش را کنار گذاشت. خود وایلز در این باره گفته است که بعد از مدتی متوجه شده که صحبت کردن با دیگران درباره ی قضیه فرما غیر ممکن است. زیرا این مطلب به موضوع شدیدا جالب توجهی برای همه تبدیل شده!

تنها کسی که از کار کردن وایلز روی قضیه آخر فرما اطلاع داشت، همسرش بود. وایلز در این باره گفته است:

   
قضیه آخر فرما

فقط همسرم می دانست که من روی قضیه فرما کار می کنم. من بعد از گذشت چند روز از ازدواجمان به او گفته بودم که قصد دارم روی این قضیه کار کنم...»

   
قضیه آخر فرما


وایلز دقیقه های هفت سال اول کارش روی این قضیه را بسیار پرارزش، مورد علاقه و سخت توصیف نموده و گفته است که قطعا نمی خواهد چنین کاری را تکرار کند. وی نهایتا در سال 1994 به اثبات حالت خاصی از حدس شیمورا-تانیاما-ویل و استنتاج قضیه آخر فرما موفق شد. وایلز در این باره می گوید:

   
قضیه آخر فرما

... این مهمترین لحظه ی زندگی کاری من بود. چیزی که ممکن است هرگز دوباره تکرار نشود! ... پس از اتمام کار، حدود بیست دقیقه گیج بودم. سپس در طول روز در دانشکده قدم می زدم. وقتی به پشت میزم برگشتم، آنرا همانجا دیدم! هنوز همانجا بود !! ...

   
قضیه آخر فرما


مقاله ای که وایلز در آن قضیه آخر فرما را ثابت کرده «خمهای بیضوی و پیمانه ای و قضیه آخر فرما» نام دارد، که در سال 1995 منتشر شد.

سیل تبریک ها و جوایز مختلف از سال 1995 به بعد به سوی او جاری شد، در حالی که در طول سالها تلاشش برای اثبات قضیه فرما، به خاطر ترک تحقیقات دیگر و کمرنگ شدن کارش مورد سرزنش و مواخذه قرار گرفته بود!

شاید آرزوی بسیاری از دانشجویان جوان ریاضی مطالعه و فهمیدن اثبات قضیه ای باشد که صورتی بدین سادگی و اثباتی آنچنان پرماجرا داشته است.

 منابع

  • Edwards, H.M., Fermatt's Last Theorem, HTM 50, Springer-Verlag, New York (1977)
  • Lenstra Hendrik W, "Euclidean Number Fields", The Mathematical Intellegancer, 1 (1979) 9- *Translated by "Alf. Van der Poorten".
  • J.J. O'Connor & E.F. Robertson, Yutaka Taniyama, Biographies Index (Internet)
  • J.J. O'Connor & E.F. Roberston, Andrew John Wiles' Biography (Internet)
  • B.B.C. Online-Archive-Pure Science- Fermat's Last Theorem. (Thursday, 2nd October 1997)
  • دکتر رحیم زارع نهندی - آخرین قضیه فرما: یک گام به پیش
  • دکتر رحیم زارع نهندی - شرحی بر اثبات آخرین قضیه فرما - خبرنامه انجمن ریاضی ایران - 1373
  • پیتر سوینرتن - دایر، سرانجام قضیه آخر فرما - نشر ریاضی، سال 6، شماره ی 1 و 2