(*^ ::[ Information = "This is a Mathematica Notebook file. It contains ASCII text, and can be transferred by email, ftp, or other text-file transfer utility. It should be read or edited using a copy of Mathematica or MathReader. If you received this as email, use your mail application or copy/paste to save everything from the line containing (*^ down to the line containing ^*) into a plain text file. On some systems you may have to give the file a name ending with ".ma" to allow Mathematica to recognize it as a Notebook. The line below identifies what version of Mathematica created this file, but it can be opened using any other version as well."; FrontEndVersion = "Macintosh Mathematica Notebook Front End Version 2.2"; MacintoshStandardFontEncoding; fontset = title, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeTitle, center, M7, bold, e8, 24, "Times"; fontset = subtitle, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeTitle, center, M7, bold, e6, 18, "Times"; fontset = subsubtitle, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeTitle, center, M7, italic, e6, 14, "Times"; fontset = section, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeSection, grayBox, M22, bold, a20, 18, "Times"; fontset = subsection, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeSection, blackBox, M19, bold, a15, 14, "Times"; fontset = subsubsection, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeSection, whiteBox, M18, bold, a12, 12, "Times"; fontset = text, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = smalltext, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 10, "Times"; fontset = input, noPageBreakInGroup, preserveAspect, groupLikeInput, M42, N23, bold, L-4, 12, "Courier"; fontset = output, output, inactive, noPageBreakInGroup, preserveAspect, groupLikeOutput, M42, N23, L-4, 12, "Courier"; fontset = message, inactive, noPageBreakInGroup, preserveAspect, groupLikeOutput, M42, N23, R32768, L-4, 12, "Courier"; fontset = print, inactive, noPageBreakInGroup, preserveAspect, groupLikeOutput, M42, N23, L-4, 12, "Courier"; fontset = info, inactive, noPageBreakInGroup, preserveAspect, groupLikeOutput, M42, N23, B32768, L-4, 12, "Courier"; fontset = postscript, PostScript, formatAsPostScript, output, inactive, noPageBreakInGroup, preserveAspect, groupLikeGraphics, M7, l34, w131, h133, 12, "Courier"; fontset = name, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, italic, 10, "Geneva"; fontset = header, inactive, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = leftheader, inactive, L2, 12, "Times"; fontset = footer, inactive, noKeepOnOnePage, preserveAspect, center, M7, 12, "Times"; fontset = leftfooter, inactive, L2, 12, "Times"; fontset = help, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 10, "Times"; fontset = clipboard, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = completions, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = special1, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = special2, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = special3, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = special4, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; fontset = special5, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; paletteColors = 128; showRuler; automaticGrouping; magnification = 125; currentKernel; ] :[font = title; inactive; preserveAspect; startGroup] Image Compression Using the Discrete Cosine Transform :[font = subsubtitle; inactive; preserveAspect] Andrew B. Watson NASA Ames Research Center :[font = section; inactive; preserveAspect; startGroup] Abstract :[font = text; inactive; preserveAspect; endGroup] The discrete cosine transform (DCT) is a technique for converting a signal into elementary frequency components. It is widely used in image compression. Here we develop some simple functions to compute the DCT and to compress images. These functions illustrate the power of Mathematica in the prototyping of image processing algorithms. ;[s] 5:0,0;271,1;272,0;274,1;286,0;338,-1; 2:3,13,9,Times,0,12,0,0,0;2,13,9,Times,2,12,0,0,0; :[font = section; inactive; preserveAspect; startGroup] :[font = text; inactive; preserveAspect] The rapid growth of digital imaging applications, including desktop publishing, multimedia, teleconferencing, and high-definition television (HDTV) has increased the need for effective and standardized image compression techniques. Among the emerging standards are JPEG, for compression of still images [Wallace 1991]; MPEG, for compression of motion video [Puri 1992]; and CCITT H.261 (also known as Px64), for compression of video telephony and teleconferencing. :[font = text; inactive; preserveAspect; endGroup] All three of these standards employ a basic technique known as the discrete cosine transform (DCT). Developed by Ahmed, Natarajan, and Rao [1974], the DCT is a close relative of the discrete Fourier transform (DFT). Its application to image compression was pioneered by Chen and Pratt [1984]. In this article, I will develop some simple functions to compute the DCT and show how it is used for image compression. We have used these functions in our laboratory to explore methods of optimizing image compression for the human viewer, using information about the human visual system [Watson 1993]. The goal of this paper is to illustrate the use of Mathematica in image processing and to provide the reader with the basic tools for further exploration of this subject. ;[s] 3:0,0;647,1;658,0;767,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,9,Times,2,12,0,0,0; :[font = section; inactive; preserveAspect; startGroup] The One-Dimensional Discrete Cosine Transform :[font = text; inactive; preserveAspect] The discrete cosine transform of a list of n real numbers s(x), x = 0, ..., n-1, is the list of length n given by: ;[s] 13:0,0;43,1;44,0;58,1;59,0;60,1;61,0;64,1;65,0;76,1;77,0;103,1;104,0;115,-1; 2:7,13,9,Times,0,12,0,0,0;6,13,9,Times,2,12,0,0,0; :[font = postscript; PostScript; formatAsPostScript; output; inactive; nowordwrap; preserveAspect; pictureLeft = 0; pictureWidth = 270; pictureHeight = 33; startGroup] %! %%Creator: Mathematica MathPictureStart % Start of picture % Scaling calculations 0 1 0 1 [ [ 0.000000 0.000000 0 0 ] [ 1.000000 0.122222 0 0 ] ] MathScale % Start of Graphics 0 setgray 0 setlinewidth 0.000000 setlinewidth 1.000000 0.000000 moveto 1.000000 0.000000 lineto stroke 0.000000 0.118519 moveto 0.000000 0.118519 lineto stroke /Times findfont 12 scalefont setfont [(S)] 0.003704 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.044444 0.037037 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.029630 0.033333 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.066667 0.033333 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.092593 0.033333 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.155556 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.196296 0.037037 -1 -1 Mshowa 0.003704 setlinewidth 0.190741 0.079630 moveto 0.179630 0.042593 lineto stroke 0.131482 0.053704 moveto 0.135185 0.053704 lineto stroke 0.005556 setlinewidth 0.136111 0.052778 moveto 0.143519 0.037963 lineto stroke 0.003704 setlinewidth 0.146296 0.038889 moveto 0.157407 0.087037 lineto stroke 0.157407 0.087037 moveto 0.220370 0.087037 lineto stroke /Times findfont 12 scalefont setfont [(C)] 0.233333 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.277778 0.037037 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.262963 0.033333 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.300000 0.033333 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(s)] 0.392593 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(x)] 0.425926 0.037037 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.407407 0.033333 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.448148 0.033333 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(cos)] 0.474074 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.555556 0.066667 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(x)] 0.581482 0.066667 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(+)] 0.611111 0.062963 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(1)] 0.640741 0.066667 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.540741 0.062963 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.662963 0.062963 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.677778 0.066667 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(p)] 0.700000 0.062963 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.611111 0.003704 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.633333 0.003704 -1 -1 Mshowa 0.538889 0.061111 moveto 0.727778 0.061111 lineto stroke /Times findfont 7 scalefont setfont [(x)] 0.325926 0.000000 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(=)] 0.340741 0.000000 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(0)] 0.359259 0.000000 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(n)] 0.329630 0.088889 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(-)] 0.344444 0.088889 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(1)] 0.359259 0.088889 -1 -1 Mshowa /Symbol findfont 18 scalefont setfont [(e)] 0.325926 0.022222 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.814815 0.037037 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.848148 0.033333 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(0)] 0.885185 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.907407 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.918519 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.933333 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.944444 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.959259 0.037037 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.974074 0.037037 -1 -1 Mshowa %% End of Graphics MathPictureEnd %% End of picture :[font = postscript; PostScript; formatAsPostScript; output; inactive; nowordwrap; preserveAspect; pictureLeft = 0; pictureWidth = 156; pictureHeight = 34; endGroup] %! %%Creator: Mathematica MathPictureStart % Start of picture % Scaling calculations 0 1 0 1 [ [ 0.000000 0.000000 0 0 ] [ 1.000000 0.217949 0 0 ] ] MathScale % Start of Graphics 0 setgray 0 setlinewidth 0.000000 setlinewidth 1.000000 0.000000 moveto 1.000000 0.000000 lineto stroke 0.000000 0.217949 moveto 0.000000 0.217949 lineto stroke /Times findfont 12 scalefont setfont [(where)] 0.006410 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(C)] 0.269231 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.346154 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.320513 0.121795 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.384615 0.121795 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.429487 0.121795 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.493590 0.128205 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(-)] 0.532051 0.166667 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(1)] 0.557692 0.166667 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(2)] 0.596154 0.166667 -1 -1 Mshowa 0.006410 setlinewidth 0.586539 0.208333 moveto 0.580128 0.176282 lineto stroke /Times findfont 12 scalefont setfont [(for)] 0.698718 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.807692 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.865385 0.121795 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(0)] 0.923077 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.429487 0.006410 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(1)] 0.487180 0.012821 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(otherwise)] 0.692308 0.012821 -1 -1 Mshowa %% End of Graphics MathPictureEnd %% End of picture :[font = text; inactive; preserveAspect] Each element of the transformed list S(u) is the inner (dot) product of the input list s(x) and a basis vector. The constant factors are chosen so that the basis vectors are orthogonal and normalized. The eight basis vectors for n = 8 are shown in Figure 1. The DCT can be written as the product of a vector (the input list) and the n x n orthogonal matrix whose rows are the basis vectors. This matrix, for n = 8, can be computed as follows: ;[s] 15:0,0;37,1;41,0;87,1;91,0;98,1;110,0;229,1;231,0;333,1;334,0;337,1;338,0;408,1;410,0;443,-1; 2:8,13,9,Times,0,12,0,0,0;7,13,9,Times,2,12,0,0,0; :[font = input; preserveAspect] DCTMatrix = Table[ If[ k==0, Sqrt[1/8], Sqrt[2/8] Cos[Pi (2j + 1) k/16] ], {k, 0, 7}, {j, 0, 7}] // N; :[font = text; inactive; preserveAspect] We can check that the matrix is orthogonal: :[font = input; preserveAspect; startGroup] DCTMatrix . Transpose[DCTMatrix] // Chop // MatrixForm :[font = output; output; inactive; preserveAspect; endGroup] MatrixForm[{{1., 0, 0, 0, 0, 0, 0, 0}, {0, 1., 0, 0, 0, 0, 0, 0}, {0, 0, 1., 0, 0, 0, 0, 0}, {0, 0, 0, 1., 0, 0, 0, 0}, {0, 0, 0, 0, 1., 0, 0, 0}, {0, 0, 0, 0, 0, 1., 0, 0}, {0, 0, 0, 0, 0, 0, 1., 0}, {0, 0, 0, 0, 0, 0, 0, 1.}}] ;[o] 1. 0 0 0 0 0 0 0 0 1. 0 0 0 0 0 0 0 0 1. 0 0 0 0 0 0 0 0 1. 0 0 0 0 0 0 0 0 1. 0 0 0 0 0 0 0 0 1. 0 0 0 0 0 0 0 0 1. 0 0 0 0 0 0 0 0 1. :[font = text; inactive; preserveAspect] Each basis vector corresponds to a sinusoid of a certain frequency: :[font = input; preserveAspect; startGroup] Show[GraphicsArray[Partition[ ListPlot[#, PlotRange -> {-.5, .5}, PlotJoined -> True, DisplayFunction -> Identity]& /@ DCTMatrix, 2] ]]; :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 32; pictureWidth = 196; pictureHeight = 248; endGroup] %! %%Creator: Mathematica %%AspectRatio: 1.2655 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.47619 0.0301309 0.47619 [ [ 0 0 0 0 ] [ 1 1.2655 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1.2655 L 0 1.2655 L closepath clip newpath p p % Start of sub-graphic p 0.0238095 0.0301309 0.477324 0.310418 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .42727 m .15986 .02352 L .29592 .59451 L .43197 .19076 L .56803 .19076 L .70408 .59451 L .84014 .02352 L .97619 .42727 L s MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.522676 0.0301309 0.97619 0.310418 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .3693 m .15986 .13734 L .29592 .56596 L .43197 .00594 L .56803 .6121 L .70408 .05208 L .84014 .4807 L .97619 .24873 L s MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.338447 0.477324 0.618735 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .52753 m .15986 .09051 L .29592 .09051 L .43197 .52753 L .56803 .52753 L .70408 .09051 L .84014 .09051 L .97619 .52753 L s MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.522676 0.338447 0.97619 0.618735 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .4807 m .15986 .00594 L .29592 .3693 L .43197 .56596 L .56803 .05208 L .70408 .24873 L .84014 .6121 L .97619 .13734 L s MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.646763 0.477324 0.927051 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .59451 m .15986 .42727 L .29592 .19076 L .43197 .02352 L .56803 .02352 L .70408 .19076 L .84014 .42727 L .97619 .59451 L s MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.522676 0.646763 0.97619 0.927051 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .56596 m .15986 .24873 L .29592 .00594 L .43197 .13734 L .56803 .4807 L .70408 .6121 L .84014 .3693 L .97619 .05208 L s MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.95508 0.477324 1.23537 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .52753 m .15986 .52753 L .29592 .52753 L .43197 .52753 L .56803 .52753 L .70408 .52753 L .84014 .52753 L .97619 .52753 L s MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.522676 0.95508 0.97619 1.23537 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations -0.112245 0.136054 0.309017 0.618034 [ [(2)] .15986 .30902 0 2 Msboxa [(3)] .29592 .30902 0 2 Msboxa [(4)] .43197 .30902 0 2 Msboxa [(5)] .56803 .30902 0 2 Msboxa [(6)] .70408 .30902 0 2 Msboxa [(7)] .84014 .30902 0 2 Msboxa [(8)] .97619 .30902 0 2 Msboxa [(-0.4)] .01131 .0618 1 0 Msboxa [(-0.2)] .01131 .18541 1 0 Msboxa [(0.2)] .01131 .43262 1 0 Msboxa [(0.4)] .01131 .55623 1 0 Msboxa [ -0.001 -0.001 0 0 ] [ 1.001 .61903 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p p .002 w .15986 .30902 m .15986 .31527 L s P [(2)] .15986 .30902 0 2 Mshowa p .002 w .29592 .30902 m .29592 .31527 L s P [(3)] .29592 .30902 0 2 Mshowa p .002 w .43197 .30902 m .43197 .31527 L s P [(4)] .43197 .30902 0 2 Mshowa p .002 w .56803 .30902 m .56803 .31527 L s P [(5)] .56803 .30902 0 2 Mshowa p .002 w .70408 .30902 m .70408 .31527 L s P [(6)] .70408 .30902 0 2 Mshowa p .002 w .84014 .30902 m .84014 .31527 L s P [(7)] .84014 .30902 0 2 Mshowa p .002 w .97619 .30902 m .97619 .31527 L s P [(8)] .97619 .30902 0 2 Mshowa p .001 w .05102 .30902 m .05102 .31277 L s P p .001 w .07823 .30902 m .07823 .31277 L s P p .001 w .10544 .30902 m .10544 .31277 L s P p .001 w .13265 .30902 m .13265 .31277 L s P p .001 w .18707 .30902 m .18707 .31277 L s P p .001 w .21429 .30902 m .21429 .31277 L s P p .001 w .2415 .30902 m .2415 .31277 L s P p .001 w .26871 .30902 m .26871 .31277 L s P p .001 w .32313 .30902 m .32313 .31277 L s P p .001 w .35034 .30902 m .35034 .31277 L s P p .001 w .37755 .30902 m .37755 .31277 L s P p .001 w .40476 .30902 m .40476 .31277 L s P p .001 w .45918 .30902 m .45918 .31277 L s P p .001 w .48639 .30902 m .48639 .31277 L s P p .001 w .51361 .30902 m .51361 .31277 L s P p .001 w .54082 .30902 m .54082 .31277 L s P p .001 w .59524 .30902 m .59524 .31277 L s P p .001 w .62245 .30902 m .62245 .31277 L s P p .001 w .64966 .30902 m .64966 .31277 L s P p .001 w .67687 .30902 m .67687 .31277 L s P p .001 w .73129 .30902 m .73129 .31277 L s P p .001 w .7585 .30902 m .7585 .31277 L s P p .001 w .78571 .30902 m .78571 .31277 L s P p .001 w .81293 .30902 m .81293 .31277 L s P p .001 w .86735 .30902 m .86735 .31277 L s P p .001 w .89456 .30902 m .89456 .31277 L s P p .001 w .92177 .30902 m .92177 .31277 L s P p .001 w .94898 .30902 m .94898 .31277 L s P p .002 w 0 .30902 m 1 .30902 L s P p .002 w .02381 .0618 m .03006 .0618 L s P [(-0.4)] .01131 .0618 1 0 Mshowa p .002 w .02381 .18541 m .03006 .18541 L s P [(-0.2)] .01131 .18541 1 0 Mshowa p .002 w .02381 .43262 m .03006 .43262 L s P [(0.2)] .01131 .43262 1 0 Mshowa p .002 w .02381 .55623 m .03006 .55623 L s P [(0.4)] .01131 .55623 1 0 Mshowa p .001 w .02381 .08652 m .02756 .08652 L s P p .001 w .02381 .11125 m .02756 .11125 L s P p .001 w .02381 .13597 m .02756 .13597 L s P p .001 w .02381 .16069 m .02756 .16069 L s P p .001 w .02381 .21013 m .02756 .21013 L s P p .001 w .02381 .23485 m .02756 .23485 L s P p .001 w .02381 .25957 m .02756 .25957 L s P p .001 w .02381 .2843 m .02756 .2843 L s P p .001 w .02381 .33374 m .02756 .33374 L s P p .001 w .02381 .35846 m .02756 .35846 L s P p .001 w .02381 .38318 m .02756 .38318 L s P p .001 w .02381 .4079 m .02756 .4079 L s P p .001 w .02381 .45735 m .02756 .45735 L s P p .001 w .02381 .48207 m .02756 .48207 L s P p .001 w .02381 .50679 m .02756 .50679 L s P p .001 w .02381 .53151 m .02756 .53151 L s P p .001 w .02381 .03708 m .02756 .03708 L s P p .001 w .02381 .01236 m .02756 .01236 L s P p .001 w .02381 .58095 m .02756 .58095 L s P p .001 w .02381 .60567 m .02756 .60567 L s P p .002 w .02381 0 m .02381 .61803 L s P P 0 0 m 1 0 L 1 .61803 L 0 .61803 L closepath clip newpath .004 w .02381 .6121 m .15986 .56596 L .29592 .4807 L .43197 .3693 L .56803 .24873 L .70408 .13734 L .84014 .05208 L .97619 .00594 L s MathSubEnd P % End of sub-graphic P P % End of Graphics MathPictureEnd :[font = text; inactive; preserveAspect] Figure 1. The eight basis vectors for the discrete cosine transform of length eight. :[font = text; inactive; preserveAspect] The list s(x) can be recovered from its transform S(u) by applying the inverse cosine transform (IDCT): ;[s] 9:0,0;9,1;10,0;11,1;12,0;50,1;51,0;52,1;53,0;104,-1; 2:5,13,9,Times,0,12,0,0,0;4,13,9,Times,2,12,0,0,0; :[font = postscript; PostScript; formatAsPostScript; output; inactive; nowordwrap; preserveAspect; pictureLeft = 0; pictureWidth = 266; pictureHeight = 33; startGroup] %! %%Creator: Mathematica MathPictureStart % Start of picture % Scaling calculations 0 1 0 1 [ [ 0.000000 0.000000 0 0 ] [ 1.000000 0.124060 0 0 ] ] MathScale % Start of Graphics 0 setgray 0 setlinewidth 0.000000 setlinewidth 1.000000 0.000000 moveto 1.000000 0.000000 lineto stroke 0.000000 0.120301 moveto 0.000000 0.120301 lineto stroke /Times findfont 12 scalefont setfont [(s)] 0.003759 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(x)] 0.041353 0.037594 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.022556 0.033835 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.063910 0.033835 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.090226 0.033835 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.157895 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.195489 0.037594 -1 -1 Mshowa 0.003759 setlinewidth 0.189850 0.080827 moveto 0.178571 0.043233 lineto stroke 0.129699 0.054511 moveto 0.133459 0.054511 lineto stroke 0.005639 setlinewidth 0.134399 0.053571 moveto 0.141917 0.038534 lineto stroke 0.003759 setlinewidth 0.144737 0.039474 moveto 0.156015 0.088346 lineto stroke 0.156015 0.088346 moveto 0.219925 0.088346 lineto stroke /Times findfont 12 scalefont setfont [(C)] 0.285714 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.330827 0.037594 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.315790 0.033835 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.357143 0.033835 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(u)] 0.233083 0.000000 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(=)] 0.248120 0.000000 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(0)] 0.266917 0.000000 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(n)] 0.236842 0.090226 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(-)] 0.251880 0.090226 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(1)] 0.266917 0.090226 -1 -1 Mshowa /Symbol findfont 18 scalefont setfont [(e)] 0.233083 0.022556 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(S)] 0.379699 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.421053 0.037594 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.402256 0.033835 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.443609 0.033835 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(cos)] 0.462406 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.545113 0.067669 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(x)] 0.571429 0.067669 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(+)] 0.601504 0.063910 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(1)] 0.631579 0.067669 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.530075 0.063910 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.654135 0.063910 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.669173 0.067669 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(p)] 0.691729 0.063910 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.601504 0.003759 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.624060 0.003759 -1 -1 Mshowa 0.528196 0.062030 moveto 0.719925 0.062030 lineto stroke /Times findfont 12 scalefont setfont [(x)] 0.812030 0.037594 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.845865 0.033835 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(0)] 0.879699 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.902256 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.917293 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.928571 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.943609 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.954887 0.037594 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.969925 0.037594 -1 -1 Mshowa %% End of Graphics MathPictureEnd %% End of picture :[font = postscript; PostScript; formatAsPostScript; output; inactive; nowordwrap; preserveAspect; pictureLeft = 0; pictureWidth = 156; pictureHeight = 35; endGroup] %! %%Creator: Mathematica MathPictureStart % Start of picture % Scaling calculations 0 1 0 1 [ [ 0.000000 0.000000 0 0 ] [ 1.000000 0.224359 0 0 ] ] MathScale % Start of Graphics 0 setgray 0 setlinewidth 0.000000 setlinewidth 1.000000 0.000000 moveto 1.000000 0.000000 lineto stroke 0.000000 0.217949 moveto 0.000000 0.217949 lineto stroke /Times findfont 12 scalefont setfont [(where)] 0.006410 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(C)] 0.269231 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.346154 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.320513 0.121795 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.384615 0.121795 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.429487 0.121795 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.493590 0.128205 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(-)] 0.532051 0.166667 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(1)] 0.557692 0.166667 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(2)] 0.596154 0.166667 -1 -1 Mshowa 0.006410 setlinewidth 0.586539 0.208333 moveto 0.580128 0.176282 lineto stroke /Times findfont 12 scalefont setfont [(for)] 0.698718 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.807692 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.865385 0.121795 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(0)] 0.923077 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.429487 0.006410 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(1)] 0.487180 0.012821 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(otherwise)] 0.692308 0.012821 -1 -1 Mshowa %% End of Graphics MathPictureEnd %% End of picture :[font = text; inactive; preserveAspect] This equation expresses s as a linear combination of the basis vectors. The coefficients are the elements of the transform S, which may be regarded as reflecting the amount of each frequency present in the input s. ;[s] 7:0,0;24,1;25,0;123,1;124,0;212,1;213,0;215,-1; 2:4,13,9,Times,0,12,0,0,0;3,13,9,Times,2,12,0,0,0; :[font = text; inactive; preserveAspect] We generate a list of random numbers to serve as a test input: :[font = input; preserveAspect; startGroup] input1 = Table[Random[Real, {-1, 1}], {8}] :[font = output; output; inactive; preserveAspect; endGroup] {0.2030556966827128, 0.98040716874821, 0.3531204775508792, -0.1066511782517621, 0.03993816720864718, 0.871475058700276, -0.6483552678597735, 0.5010669346387767} ;[o] {0.203056, 0.980407, 0.35312, -0.106651, 0.0399382, 0.871475, -0.648355, 0.501067} :[font = text; inactive; preserveAspect] The DCT is computed by matrix multiplication: :[font = input; preserveAspect; startGroup] output1 = DCTMatrix . input1 :[font = output; output; inactive; preserveAspect; endGroup] {0.775716311805223, 0.3727004490356919, 0.1852988054973134, 0.01214607165289278, -0.3249996469128419, -0.993021472202571, 0.5597944129971343, -0.6251272225745845} ;[o] {0.775716, 0.3727, 0.185299, 0.0121461, -0.325, -0.993021, 0.559794, -0.625127} :[font = text; inactive; preserveAspect] As noted above, the DCT is closely related to the discrete Fourier transform (DFT). In fact, it is possible to compute the DCT via the DFT (see [Jain 1989, p. 152]): First create a new list by extracting the even elements, followed by the reversed odd elements. Then multiply the DFT of this re-ordered list by so-called "twiddle factors" and take the real part. We can carry out this process for n = 8 using Mathematica's DFT function. ;[s] 5:0,0;399,1;400,0;411,1;422,0;440,-1; 2:3,13,9,Times,0,12,0,0,0;2,13,9,Times,2,12,0,0,0; :[font = input; preserveAspect; startGroup] DCTTwiddleFactors = N @ Join[{1}, Table[Sqrt[2] Exp[-I Pi k /16], {k, 7}]] :[font = output; output; inactive; preserveAspect; endGroup] {1., 1.387039845322147 - 0.275899379282943*I, 1.306562964876377 - 0.541196100146197*I, 1.175875602419359 - 0.7856949583871021*I, 1. - 1.*I, 0.7856949583871024 - 1.175875602419359*I, 0.541196100146197 - 1.306562964876377*I, 0.2758993792829431 - 1.387039845322147*I} ;[o] {1., 1.38704 - 0.275899 I, 1.30656 - 0.541196 I, 1.17588 - 0.785695 I, 1. - 1. I, 0.785695 - 1.17588 I, 0.541196 - 1.30656 I, 0.275899 - 1.38704 I} :[font = text; inactive; preserveAspect] The function to compute the DCT of a list of length n = 8 is then: ;[s] 3:0,0;52,1;53,0;67,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,9,Times,2,12,0,0,0; :[font = input; preserveAspect] DCT[list_] := Re[ DCTTwiddleFactors * InverseFourier[N[list[[{1, 3, 5, 7, 8, 6, 4, 2}]]]]] :[font = text; inactive; preserveAspect] Note that we use the function InverseFourier to implement what is usually in engineering called the forward DFT. Likewise, we use Fourier to implement what is usually called the inverse DFT. The function N is used to convert integers to reals because (in Version 2.2) Fourier and InverseFourier are not evaluated numerically when their arguments are all integers. The special case of a list of zeros needs to be handled separately by overloading the functions, since N of the integer 0 is an integer and not a real. [See In[] and Out[], page ?? --ed.] ;[s] 13:0,0;30,1;44,0;130,1;137,0;204,1;205,0;269,1;276,0;281,1;295,0;468,1;469,0;554,-1; 2:7,13,9,Times,0,12,0,0,0;6,13,10,Courier,1,12,0,0,0; :[font = input; preserveAspect] Unprotect[Fourier, InverseFourier]; Fourier[x:{0 ..}]:= x; InverseFourier[x:{0 ..}]:= x; Protect[Fourier, InverseFourier]; :[font = text; inactive; preserveAspect] We apply DCT to our test input and compare it to the earlier result computed by matrix multiplication. To compare the results, we subtract them and apply the Chop function to suppress values very close to zero: ;[s] 5:0,0;9,1;12,0;158,1;162,0;211,-1; 2:3,13,9,Times,0,12,0,0,0;2,13,10,Courier,1,12,0,0,0; :[font = input; preserveAspect; startGroup] DCT[input1] :[font = output; output; inactive; preserveAspect; endGroup] {0.775716311805223, 0.3727004490356915, 0.1852988054973138, 0.01214607165289255, -0.324999646912842, -0.993021472202571, 0.5597944129971343, -0.6251272225745844} ;[o] {0.775716, 0.3727, 0.185299, 0.0121461, -0.325, -0.993021, 0.559794, -0.625127} :[font = input; preserveAspect; startGroup] % - output1 // Chop :[font = output; output; inactive; preserveAspect; endGroup] {0, 0, 0, 0, 0, 0, 0, 0} ;[o] {0, 0, 0, 0, 0, 0, 0, 0} :[font = text; inactive; preserveAspect] The inverse DCT can be computed by multiplication with the inverse of the DCT matrix. We illustrate this with our previous example: :[font = input; preserveAspect; startGroup] Inverse[DCTMatrix] . output1 :[font = output; output; inactive; preserveAspect; endGroup] {0.2030556966827132, 0.98040716874821, 0.3531204775508789, -0.106651178251762, 0.03993816720864712, 0.871475058700276, -0.6483552678597735, 0.5010669346387765} ;[o] {0.203056, 0.980407, 0.35312, -0.106651, 0.0399382, 0.871475, -0.648355, 0.501067} :[font = input; preserveAspect; startGroup] % - input1 // Chop :[font = output; output; inactive; preserveAspect; endGroup] {0, 0, 0, 0, 0, 0, 0, 0} ;[o] {0, 0, 0, 0, 0, 0, 0, 0} :[font = text; inactive; preserveAspect] As you might expect, the IDCT can also be computed via the inverse DFT. The "twiddle factors" are the complex conjugates of the DCT factors and the reordering is applied at the end rather than the beginning: :[font = input; preserveAspect; startGroup] IDCTTwiddleFactors = Conjugate[DCTTwiddleFactors] :[font = output; output; inactive; preserveAspect; endGroup] {1., 1.387039845322147 + 0.275899379282943*I, 1.306562964876377 + 0.541196100146197*I, 1.175875602419359 + 0.7856949583871021*I, 1. + 1.*I, 0.7856949583871024 + 1.175875602419359*I, 0.541196100146197 + 1.306562964876377*I, 0.2758993792829431 + 1.387039845322147*I} ;[o] {1., 1.38704 + 0.275899 I, 1.30656 + 0.541196 I, 1.17588 + 0.785695 I, 1. + 1. I, 0.785695 + 1.17588 I, 0.541196 + 1.30656 I, 0.275899 + 1.38704 I} :[font = input; preserveAspect] IDCT[list_] := Re[Fourier[ IDCTTwiddleFactors list] ][[{1, 8, 2, 7, 3, 6, 4, 5}]] :[font = text; inactive; preserveAspect] For example: :[font = input; preserveAspect; startGroup] IDCT[DCT[input1]] - input1 // Chop :[font = output; output; inactive; preserveAspect; endGroup; endGroup] {0, 0, 0, 0, 0, 0, 0, 0} ;[o] {0, 0, 0, 0, 0, 0, 0, 0} :[font = section; inactive; preserveAspect; startGroup] The Two-Dimensional DCT :[font = text; inactive; preserveAspect] The one-dimensional DCT is useful in processing one-dimensional signals such as speech waveforms. For analysis of two-dimensional (2D) signals such as images, we need a 2D version of the DCT. For an n x m matrix s, the 2D DCT is computed in a simple way: The 1D DCT is applied to each row of s and then to each column of the result. Thus, the transform of s is given by ;[s] 11:0,0;199,1;200,0;203,1;204,0;212,1;213,0;292,1;293,0;356,1;357,0;370,-1; 2:6,13,9,Times,0,12,0,0,0;5,13,9,Times,2,12,0,0,0; :[font = postscript; PostScript; formatAsPostScript; output; inactive; nowordwrap; preserveAspect; pictureLeft = 0; pictureWidth = 454; pictureHeight = 35; startGroup] %! %%Creator: Mathematica MathPictureStart % Start of picture % Scaling calculations 0 1 0 1 [ [ 0.000000 0.000000 0 0 ] [ 1.000000 0.077093 0 0 ] ] MathScale % Start of Graphics 0 setgray 0 setlinewidth 0.000000 setlinewidth 1.000000 0.000000 moveto 1.000000 0.000000 lineto stroke 0.000000 0.074890 moveto 0.000000 0.074890 lineto stroke /Times findfont 12 scalefont setfont [(S)] 0.002203 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.026432 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.039648 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(v)] 0.048458 0.026432 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.017621 0.024229 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.059471 0.024229 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.074890 0.024229 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.118943 0.044053 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.116740 0.006608 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(m)] 0.132159 0.006608 -1 -1 Mshowa 0.002203 setlinewidth 0.100220 0.016520 moveto 0.102423 0.016520 lineto stroke 0.003304 setlinewidth 0.102974 0.015969 moveto 0.107379 0.007159 lineto stroke 0.002203 setlinewidth 0.109031 0.007709 moveto 0.115639 0.036344 lineto stroke 0.115639 0.036344 moveto 0.153084 0.036344 lineto stroke 0.098018 0.040749 moveto 0.155286 0.040749 lineto stroke /Times findfont 12 scalefont setfont [(C)] 0.162996 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.189427 0.026432 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.180617 0.024229 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.204846 0.024229 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(C)] 0.213656 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(v)] 0.240088 0.026432 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.231278 0.024229 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.253304 0.024229 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(s)] 0.345815 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(x)] 0.367841 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.378855 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(y)] 0.389868 0.026432 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.356828 0.024229 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.403084 0.024229 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(cos)] 0.416300 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.464758 0.044053 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(x)] 0.480176 0.044053 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(+)] 0.500000 0.041850 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(1)] 0.517621 0.044053 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.455947 0.041850 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.528634 0.041850 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.537445 0.044053 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(p)] 0.550661 0.041850 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.497797 0.006608 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.513216 0.006608 -1 -1 Mshowa 0.457049 0.040749 moveto 0.567181 0.040749 lineto stroke /Times findfont 7 scalefont setfont [(x)] 0.308370 0.004405 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(=)] 0.317181 0.004405 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(0)] 0.325991 0.004405 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(n)] 0.308370 0.057269 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(-)] 0.317181 0.057269 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(1)] 0.325991 0.057269 -1 -1 Mshowa /Symbol findfont 18 scalefont setfont [(e)] 0.306167 0.017621 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(cos)] 0.574890 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.623348 0.044053 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(y)] 0.638767 0.044053 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(+)] 0.656388 0.041850 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(1)] 0.674009 0.044053 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.614537 0.041850 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.687225 0.041850 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.696035 0.044053 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(p)] 0.709251 0.041850 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.654185 0.006608 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(m)] 0.667401 0.006608 -1 -1 Mshowa 0.615639 0.040749 moveto 0.725771 0.040749 lineto stroke /Times findfont 7 scalefont setfont [(y)] 0.268723 0.004405 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(=)] 0.277533 0.004405 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(0)] 0.286344 0.004405 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(m)] 0.266520 0.057269 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(-)] 0.279736 0.057269 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(1)] 0.288546 0.057269 -1 -1 Mshowa /Symbol findfont 18 scalefont setfont [(e)] 0.266520 0.017621 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.751101 0.026432 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.770925 0.024229 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(0)] 0.792952 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.806167 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.812775 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.821586 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.828194 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.837004 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(n)] 0.845815 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(v)] 0.883260 0.026432 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.903084 0.024229 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(0)] 0.922908 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.936123 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.944934 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.951542 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(.)] 0.958150 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(,)] 0.966960 0.026432 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(m)] 0.975771 0.026432 -1 -1 Mshowa %% End of Graphics MathPictureEnd %% End of picture :[font = postscript; PostScript; formatAsPostScript; output; inactive; nowordwrap; preserveAspect; pictureLeft = 0; pictureWidth = 156; pictureHeight = 35; endGroup] %! %%Creator: Mathematica MathPictureStart % Start of picture % Scaling calculations 0 1 0 1 [ [ 0.000000 0.000000 0 0 ] [ 1.000000 0.224359 0 0 ] ] MathScale % Start of Graphics 0 setgray 0 setlinewidth 0.000000 setlinewidth 1.000000 0.000000 moveto 1.000000 0.000000 lineto stroke 0.000000 0.217949 moveto 0.000000 0.217949 lineto stroke /Times findfont 12 scalefont setfont [(where)] 0.006410 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(C)] 0.269231 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.346154 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.320513 0.121795 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.384615 0.121795 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.429487 0.121795 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(2)] 0.493590 0.128205 -1 -1 Mshowa /Symbol findfont 7 scalefont setfont [(-)] 0.532051 0.166667 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(1)] 0.557692 0.166667 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(2)] 0.596154 0.166667 -1 -1 Mshowa 0.006410 setlinewidth 0.586539 0.208333 moveto 0.580128 0.176282 lineto stroke /Times findfont 12 scalefont setfont [(for)] 0.698718 0.128205 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(u)] 0.807692 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.865385 0.121795 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(0)] 0.923077 0.128205 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.429487 0.006410 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(1)] 0.487180 0.012821 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(otherwise)] 0.692308 0.012821 -1 -1 Mshowa %% End of Graphics MathPictureEnd %% End of picture :[font = text; inactive; preserveAspect] Since the 2D DCT can be computed by applying 1D transforms separately to the rows and columns, we say that the 2D DCT is separable in the two dimensions. ;[s] 3:0,0;121,1;130,0;154,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,9,Times,2,12,0,0,0; :[font = text; inactive; preserveAspect] As in the one-dimensional case, each element S(u, v) of the transform is the inner product of the input and a basis function, but in this case, the basis functions are n x m matrices. Each two-dimensional basis matrix is the outer product of two of the one-dimensional basis vectors. For n = m = 8, the following expression creates an 8 x 8 array of the 8 x 8 basis matrices, a tensor with dimensions {8, 8, 8, 8}: ;[s] 15:0,0;45,1;46,0;47,1;48,0;50,1;51,0;168,1;169,0;172,1;173,0;288,1;289,0;292,1;293,0;416,-1; 2:8,13,9,Times,0,12,0,0,0;7,13,9,Times,2,12,0,0,0; :[font = input; preserveAspect] DCTTensor = Array[ Outer[Times, DCTMatrix[[#1]], DCTMatrix[[#2]]]&, {8, 8}]; :[font = text; inactive; preserveAspect] Each basis matrix can be thought of as an image. The 64 basis images in the array are shown in Figure 2. :[font = text; inactive; preserveAspect] The package GraphicsImage.m, included in the electronic supplement, contains the functions GraphicsImage and ShowImage to create and display a graphics object from a given matrix. GraphicsImage uses the built-in function Raster to translate a matrix into an array of gray cells. The matrix elements are scaled so that the image spans the full range of graylevels. An optional second argument specifies a range of values to occupy the full grayscale; values outside the range are clipped. The function ShowImage displays the graphics object using Show. ;[s] 15:0,0;12,1;27,0;91,1;104,0;109,1;118,0;180,1;193,0;221,1;227,0;501,1;510,0;546,1;550,0;552,-1; 2:8,13,9,Times,0,12,0,0,0;7,13,10,Courier,1,12,0,0,0; :[font = input; preserveAspect] << GraphicsImage.m :[font = input; preserveAspect; startGroup] Show[GraphicsArray[ Map[GraphicsImage[#, {-.25, .25}]&, Reverse[DCTTensor], {2}] ]]; :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 33; pictureWidth = 224; pictureHeight = 224; endGroup] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath p p % Start of sub-graphic p 0.0238095 0.0238095 0.133279 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.0238095 0.253695 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D8CBB2916E4D3427 D8CBB2916E4D3427 D8CBB2916E4D3427 D8CBB2916E4D3427 D8CBB2916E4D3427 D8CBB2916E4D3427 D8CBB2916E4D3427 D8CBB2916E4D3427 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.0238095 0.374111 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.0238095 0.494527 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage CB6E274DB2D89134 CB6E274DB2D89134 CB6E274DB2D89134 CB6E274DB2D89134 CB6E274DB2D89134 CB6E274DB2D89134 CB6E274DB2D89134 CB6E274DB2D89134 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.0238095 0.614943 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C04040C0C04040C0 C04040C0C04040C0 C04040C0C04040C0 C04040C0C04040C0 C04040C0C04040C0 C04040C0C04040C0 C04040C0C04040C0 C04040C0C04040C0 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.0238095 0.735359 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage B22791CB346ED84D B22791CB346ED84D B22791CB346ED84D B22791CB346ED84D B22791CB346ED84D B22791CB346ED84D B22791CB346ED84D B22791CB346ED84D pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.0238095 0.855774 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage A22CD35D5DD32CA2 A22CD35D5DD32CA2 A22CD35D5DD32CA2 A22CD35D5DD32CA2 A22CD35D5DD32CA2 A22CD35D5DD32CA2 A22CD35D5DD32CA2 A22CD35D5DD32CA2 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.0238095 0.97619 0.133279 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 914DCB27D834B26E 914DCB27D834B26E 914DCB27D834B26E 914DCB27D834B26E 914DCB27D834B26E 914DCB27D834B26E 914DCB27D834B26E 914DCB27D834B26E pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.144226 0.133279 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D8D8D8D8D8D8D8D8 CBCBCBCBCBCBCBCB B2B2B2B2B2B2B2B2 9191919191919191 6E6E6E6E6E6E6E6E 4D4D4D4D4D4D4D4D 3434343434343434 2727272727272727 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.144226 0.253695 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage FBE8C598673A1704 E8D8BB946B442717 C5BBA78D7258443A 98948D847B726B67 676B727B848D9498 3A4458728DA7BBC5 1727446B94BBD8E8 04173A6798C5E8FB pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.144226 0.374111 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage F3B04F0C0C4FB0F3 E2A8571D1D57A8E2 C19B643E3E649BC1 9789766868768997 6876899797897668 3E649BC1C19B643E 1D57A8E2E2A8571D 0C4FB0F3F3B04F0C pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.144226 0.494527 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage E867043AC5FB9817 D86B1744BBE89427 BB723A58A7C58D44 947B67728D98846B 6B84988D72677B94 448DC5A7583A72BB 2794E8BB44176BD8 1798FBC53A0467E8 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.144226 0.614943 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D82727D8D82727D8 CB3434CBCB3434CB B24D4DB2B24D4DB2 916E6E91916E6E91 6E91916E6E91916E 4DB2B24D4DB2B24D 34CBCB3434CBCB34 27D8D82727D8D827 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.144226 0.735359 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C50498E81767FB3A BB1794D8276BE844 A73A8DBB4472C558 8D6784946B7B9872 72987B6B9484678D 58C57244BB8D3AA7 44E86B27D89417BB 3AFB6717E89804C5 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.144226 0.855774 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage B00CF34F4FF30CB0 A81DE25757E21DA8 9B3EC16464C13E9B 8968977676976889 7697688989689776 64C13E9B9B3EC164 57E21DA8A81DE257 4FF30CB0B00CF34F pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.144226 0.97619 0.253695 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 983AE804FB17C567 9444D817E827BB6B 8D58BB3AC544A772 84729467986B8D7B 7B8D6B9867947284 72A744C53ABB588D 6BBB27E817D84494 67C517FB04E83A98 pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.264641 0.133279 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D3D3D3D3D3D3D3D3 A2A2A2A2A2A2A2A2 5D5D5D5D5D5D5D5D 2C2C2C2C2C2C2C2C 2C2C2C2C2C2C2C2C 5D5D5D5D5D5D5D5D A2A2A2A2A2A2A2A2 D3D3D3D3D3D3D3D3 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.264641 0.253695 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage F3E2C197683E1D0C B0A89B897664574F 4F576476899BA8B0 0C1D3E6897C1E2F3 0C1D3E6897C1E2F3 4F576476899BA8B0 B0A89B897664574F F3E2C197683E1D0C pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.264641 0.374111 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage EDAD52121252ADED AD926D52526D92AD 526D92ADAD926D52 1252ADEDEDAD5212 1252ADEDEDAD5212 526D92ADAD926D52 AD926D52526D92AD EDAD52121252ADED pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.264641 0.494527 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage E2680C3EC1F3971D A8764F649BB08957 5789B09B644F76A8 1D97F3C13E0C68E2 1D97F3C13E0C68E2 5789B09B644F76A8 A8764F649BB08957 E2680C3EC1F3971D pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.264641 0.614943 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D32C2CD3D32C2CD3 A25D5DA2A25D5DA2 5DA2A25D5DA2A25D 2CD3D32C2CD3D32C 2CD3D32C2CD3D32C 5DA2A25D5DA2A25D A25D5DA2A25D5DA2 D32C2CD3D32C2CD3 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.264641 0.735359 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C10C97E21D68F33E 9B4F89A85776B064 64B07657A8894F9B 3EF3681DE2970CC1 3EF3681DE2970CC1 64B07657A8894F9B 9B4F89A85776B064 C10C97E21D68F33E pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.264641 0.855774 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage AD12ED5252ED12AD 9252AD6D6DAD5292 6DAD52929252AD6D 52ED12ADAD12ED52 52ED12ADAD12ED52 6DAD52929252AD6D 9252AD6D6DAD5292 AD12ED5252ED12AD pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.264641 0.97619 0.374111 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 973EE20CF31DC168 8964A84FB0579B76 769B57B04FA86489 68C11DF30CE23E97 68C11DF30CE23E97 769B57B04FA86489 8964A84FB0579B76 973EE20CF31DC168 pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.385057 0.133279 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage CBCBCBCBCBCBCBCB 6E6E6E6E6E6E6E6E 2727272727272727 4D4D4D4D4D4D4D4D B2B2B2B2B2B2B2B2 D8D8D8D8D8D8D8D8 9191919191919191 3434343434343434 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.385057 0.253695 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage E8D8BB946B442717 676B727B848D9498 04173A6798C5E8FB 3A4458728DA7BBC5 C5BBA78D7258443A FBE8C598673A1704 98948D847B726B67 1727446B94BBD8E8 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.385057 0.374111 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage E2A8571D1D57A8E2 6876899797897668 0C4FB0F3F3B04F0C 3E649BC1C19B643E C19B643E3E649BC1 F3B04F0C0C4FB0F3 9789766868768997 1D57A8E2E2A8571D pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.385057 0.494527 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D86B1744BBE89427 6B84988D72677B94 1798FBC53A0467E8 448DC5A7583A72BB BB723A58A7C58D44 E867043AC5FB9817 947B67728D98846B 2794E8BB44176BD8 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.385057 0.614943 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage CB3434CBCB3434CB 6E91916E6E91916E 27D8D82727D8D827 4DB2B24D4DB2B24D B24D4DB2B24D4DB2 D82727D8D82727D8 916E6E91916E6E91 34CBCB3434CBCB34 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.385057 0.735359 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage BB1794D8276BE844 72987B6B9484678D 3AFB6717E89804C5 58C57244BB8D3AA7 A73A8DBB4472C558 C50498E81767FB3A 8D6784946B7B9872 44E86B27D89417BB pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.385057 0.855774 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage A81DE25757E21DA8 7697688989689776 4FF30CB0B00CF34F 64C13E9B9B3EC164 9B3EC16464C13E9B B00CF34F4FF30CB0 8968977676976889 57E21DA8A81DE257 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.385057 0.97619 0.494527 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 9444D817E827BB6B 7B8D6B9867947284 67C517FB04E83A98 72A744C53ABB588D 8D58BB3AC544A772 983AE804FB17C567 84729467986B8D7B 6BBB27E817D84494 pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.505473 0.133279 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C0C0C0C0C0C0C0C0 4040404040404040 4040404040404040 C0C0C0C0C0C0C0C0 C0C0C0C0C0C0C0C0 4040404040404040 4040404040404040 C0C0C0C0C0C0C0C0 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.505473 0.253695 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D8CBB2916E4D3427 27344D6E91B2CBD8 27344D6E91B2CBD8 D8CBB2916E4D3427 D8CBB2916E4D3427 27344D6E91B2CBD8 27344D6E91B2CBD8 D8CBB2916E4D3427 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.505473 0.374111 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage D3A25D2C2C5DA2D3 2C5DA2D3D3A25D2C 2C5DA2D3D3A25D2C D3A25D2C2C5DA2D3 D3A25D2C2C5DA2D3 2C5DA2D3D3A25D2C 2C5DA2D3D3A25D2C D3A25D2C2C5DA2D3 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.505473 0.494527 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage CB6E274DB2D89134 3491D8B24D276ECB 3491D8B24D276ECB CB6E274DB2D89134 CB6E274DB2D89134 3491D8B24D276ECB 3491D8B24D276ECB CB6E274DB2D89134 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.505473 0.614943 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C04040C0C04040C0 40C0C04040C0C040 40C0C04040C0C040 C04040C0C04040C0 C04040C0C04040C0 40C0C04040C0C040 40C0C04040C0C040 C04040C0C04040C0 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.505473 0.735359 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage B22791CB346ED84D 4DD86E34CB9127B2 4DD86E34CB9127B2 B22791CB346ED84D B22791CB346ED84D 4DD86E34CB9127B2 4DD86E34CB9127B2 B22791CB346ED84D pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.505473 0.855774 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage A22CD35D5DD32CA2 5DD32CA2A22CD35D 5DD32CA2A22CD35D A22CD35D5DD32CA2 A22CD35D5DD32CA2 5DD32CA2A22CD35D 5DD32CA2A22CD35D A22CD35D5DD32CA2 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.505473 0.97619 0.614943 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 914DCB27D834B26E 6EB234D827CB4D91 6EB234D827CB4D91 914DCB27D834B26E 914DCB27D834B26E 6EB234D827CB4D91 6EB234D827CB4D91 914DCB27D834B26E pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.625889 0.133279 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage B2B2B2B2B2B2B2B2 2727272727272727 9191919191919191 CBCBCBCBCBCBCBCB 3434343434343434 6E6E6E6E6E6E6E6E D8D8D8D8D8D8D8D8 4D4D4D4D4D4D4D4D pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.625889 0.253695 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C5BBA78D7258443A 04173A6798C5E8FB 98948D847B726B67 E8D8BB946B442717 1727446B94BBD8E8 676B727B848D9498 FBE8C598673A1704 3A4458728DA7BBC5 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.625889 0.374111 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage C19B643E3E649BC1 0C4FB0F3F3B04F0C 9789766868768997 E2A8571D1D57A8E2 1D57A8E2E2A8571D 6876899797897668 F3B04F0C0C4FB0F3 3E649BC1C19B643E pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.625889 0.494527 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage BB723A58A7C58D44 1798FBC53A0467E8 947B67728D98846B D86B1744BBE89427 2794E8BB44176BD8 6B84988D72677B94 E867043AC5FB9817 448DC5A7583A72BB pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.625889 0.614943 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage B24D4DB2B24D4DB2 27D8D82727D8D827 916E6E91916E6E91 CB3434CBCB3434CB 34CBCB3434CBCB34 6E91916E6E91916E D82727D8D82727D8 4DB2B24D4DB2B24D pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.625889 0.735359 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage A73A8DBB4472C558 3AFB6717E89804C5 8D6784946B7B9872 BB1794D8276BE844 44E86B27D89417BB 72987B6B9484678D C50498E81767FB3A 58C57244BB8D3AA7 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.625889 0.855774 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 9B3EC16464C13E9B 4FF30CB0B00CF34F 8968977676976889 A81DE25757E21DA8 57E21DA8A81DE257 7697688989689776 B00CF34F4FF30CB0 64C13E9B9B3EC164 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.625889 0.97619 0.735359 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 8D58BB3AC544A772 67C517FB04E83A98 84729467986B8D7B 9444D817E827BB6B 6BBB27E817D84494 7B8D6B9867947284 983AE804FB17C567 72A744C53ABB588D pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.746305 0.133279 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage A2A2A2A2A2A2A2A2 2C2C2C2C2C2C2C2C D3D3D3D3D3D3D3D3 5D5D5D5D5D5D5D5D 5D5D5D5D5D5D5D5D D3D3D3D3D3D3D3D3 2C2C2C2C2C2C2C2C A2A2A2A2A2A2A2A2 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.746305 0.253695 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage B0A89B897664574F 0C1D3E6897C1E2F3 F3E2C197683E1D0C 4F576476899BA8B0 4F576476899BA8B0 F3E2C197683E1D0C 0C1D3E6897C1E2F3 B0A89B897664574F pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.746305 0.374111 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage AD926D52526D92AD 1252ADEDEDAD5212 EDAD52121252ADED 526D92ADAD926D52 526D92ADAD926D52 EDAD52121252ADED 1252ADEDEDAD5212 AD926D52526D92AD pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.746305 0.494527 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage A8764F649BB08957 1D97F3C13E0C68E2 E2680C3EC1F3971D 5789B09B644F76A8 5789B09B644F76A8 E2680C3EC1F3971D 1D97F3C13E0C68E2 A8764F649BB08957 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.746305 0.614943 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage A25D5DA2A25D5DA2 2CD3D32C2CD3D32C D32C2CD3D32C2CD3 5DA2A25D5DA2A25D 5DA2A25D5DA2A25D D32C2CD3D32C2CD3 2CD3D32C2CD3D32C A25D5DA2A25D5DA2 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.746305 0.735359 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 9B4F89A85776B064 3EF3681DE2970CC1 C10C97E21D68F33E 64B07657A8894F9B 64B07657A8894F9B C10C97E21D68F33E 3EF3681DE2970CC1 9B4F89A85776B064 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.746305 0.855774 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 9252AD6D6DAD5292 52ED12ADAD12ED52 AD12ED5252ED12AD 6DAD52929252AD6D 6DAD52929252AD6D AD12ED5252ED12AD 52ED12ADAD12ED52 9252AD6D6DAD5292 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.746305 0.97619 0.855774 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 8964A84FB0579B76 68C11DF30CE23E97 973EE20CF31DC168 769B57B04FA86489 769B57B04FA86489 973EE20CF31DC168 68C11DF30CE23E97 8964A84FB0579B76 pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.866721 0.133279 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 9191919191919191 4D4D4D4D4D4D4D4D CBCBCBCBCBCBCBCB 2727272727272727 D8D8D8D8D8D8D8D8 3434343434343434 B2B2B2B2B2B2B2B2 6E6E6E6E6E6E6E6E pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.144226 0.866721 0.253695 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 98948D847B726B67 3A4458728DA7BBC5 E8D8BB946B442717 04173A6798C5E8FB FBE8C598673A1704 1727446B94BBD8E8 C5BBA78D7258443A 676B727B848D9498 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.264641 0.866721 0.374111 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 9789766868768997 3E649BC1C19B643E E2A8571D1D57A8E2 0C4FB0F3F3B04F0C F3B04F0C0C4FB0F3 1D57A8E2E2A8571D C19B643E3E649BC1 6876899797897668 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.385057 0.866721 0.494527 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 947B67728D98846B 448DC5A7583A72BB D86B1744BBE89427 1798FBC53A0467E8 E867043AC5FB9817 2794E8BB44176BD8 BB723A58A7C58D44 6B84988D72677B94 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.505473 0.866721 0.614943 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 916E6E91916E6E91 4DB2B24D4DB2B24D CB3434CBCB3434CB 27D8D82727D8D827 D82727D8D82727D8 34CBCB3434CBCB34 B24D4DB2B24D4DB2 6E91916E6E91916E pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.625889 0.866721 0.735359 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 8D6784946B7B9872 58C57244BB8D3AA7 BB1794D8276BE844 3AFB6717E89804C5 C50498E81767FB3A 44E86B27D89417BB A73A8DBB4472C558 72987B6B9484678D pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.746305 0.866721 0.855774 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 8968977676976889 64C13E9B9B3EC164 A81DE25757E21DA8 4FF30CB0B00CF34F B00CF34F4FF30CB0 57E21DA8A81DE257 9B3EC16464C13E9B 7697688989689776 pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.866721 0.866721 0.97619 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 84729467986B8D7B 72A744C53ABB588D 9444D817E827BB6B 67C517FB04E83A98 983AE804FB17C567 6BBB27E817D84494 8D58BB3AC544A772 7B8D6B9867947284 pop P % End of image MathSubEnd P % End of sub-graphic P P % End of Graphics MathPictureEnd :[font = text; inactive; preserveAspect] Figure 2. The 8 x 8 array of basis images for the two-dimensional discrete cosine transform. :[font = text; inactive; preserveAspect] Each basis matrix is characterized by a horizontal and a vertical spatial frequency. The matrices shown here are arranged left to right and bottom to top in order of increasing frequencies. :[font = text; inactive; preserveAspect] To illustrate the 2D transform, we apply it to an 8 x 8 image of the letter A: :[font = input; preserveAspect; startGroup] ShowImage[ input2 = {{0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}}] :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 34; pictureWidth = 131; pictureHeight = 131] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 00FF000000FF0000 00FF000000FF0000 00FFFFFFFFFF0000 00FF000000FF0000 0000FF00FF000000 0000FF00FF000000 0000FF00FF000000 000000FF00000000 pop P % End of image % End of Graphics MathPictureEnd :[font = output; output; inactive; preserveAspect; endGroup] Graphics["<<>>"] ;[o] -Graphics- :[font = text; inactive; preserveAspect] As in the 1D case, it is possible to express the 2D DCT as an array of inner products (a tensor contraction): :[font = input; preserveAspect] output2 = Array[ (Plus @@ Flatten[DCTTensor[[#1, #2]] input2])&, {8, 8}]; :[font = input; preserveAspect; startGroup] ShowImage[output2] :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 34; pictureWidth = 131; pictureHeight = 131] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage FF81005F24136D58 7D607B8C13295400 4054716062724A26 4055685B5B4A6FAB 36527D665B6B4D2C 6A5E5D6647475F57 7A6338496C695755 7E652C41705E668F pop P % End of image % End of Graphics MathPictureEnd :[font = output; output; inactive; preserveAspect; endGroup] Graphics["<<>>"] ;[o] -Graphics- :[font = text; inactive; preserveAspect] The pixels in this DCT image describe the proportion of each two-dimensional basis function present in the input image. The pixels are arranged as above, with horizontal and vertical frequency increasing from left to right and bottom to top, respectively. The brightest pixel in the lower left corner is known as the DC term, with frequency {0, 0}. It is the average of the pixels in the input, and is typically the largest coefficient in the DCT of "natural" images. :[font = text; inactive; preserveAspect] An inverse 2D IDCT can also be computed in terms of DCTTensor; we leave this as an exercise for the reader. ;[s] 3:0,0;52,1;61,0;109,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,10,Courier,1,12,0,0,0; :[font = text; inactive; preserveAspect] Since the two-dimensional DCT is separable, we can extend our function DCT to the case of two-dimensional input as follows: ;[s] 3:0,0;71,1;74,0;126,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,10,Courier,1,12,0,0,0; :[font = input; preserveAspect] DCT[array_?MatrixQ] := Transpose[DCT /@ Transpose[DCT /@ array] ] :[font = text; inactive; preserveAspect] This function assumes that its input is an 8 x 8 matrix. It takes the 1D DCT of each row, transposes the result, takes the DCT of each new row, and transposes again. This function is more efficient than computing the tensor contraction shown above, since it exploits the built-in function InverseFourier. ;[s] 3:0,0;289,1;303,0;305,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,10,Courier,1,12,0,0,0; :[font = text; inactive; preserveAspect] We compare the result of this function to that obtained using contraction of tensors : :[font = input; preserveAspect; startGroup] DCT[input2] - output2 // Chop // Abs // Max :[font = output; output; inactive; preserveAspect; endGroup] 0 ;[o] 0 :[font = text; inactive; preserveAspect] The definition of the inverse 2D DCT is straightforward: :[font = input; preserveAspect] IDCT[array_?MatrixQ] := Transpose[IDCT /@ Transpose[IDCT /@ array] ] :[font = text; inactive; preserveAspect] As an example, we invert the transform of the letter A: :[font = input; preserveAspect; startGroup] ShowImage[Chop[IDCT[output2]]]; :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 34; pictureWidth = 131; pictureHeight = 131; endGroup] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 00FF000000FF0000 00FF000000FF0000 00FFFFFFFFFF0000 00FF000000FF0000 0000FF00FF000000 0000FF00FF000000 0000FF00FF000000 000000FF00000000 pop P % End of image % End of Graphics MathPictureEnd :[font = text; inactive; preserveAspect] As noted earlier, the components of the DCT output indicate the magnitude of image components at various 2D spatial frequencies. To illustrate, we can set the last row and column of the DCT of the letter A equal to zero: :[font = input; preserveAspect] output2[[8]] = Table[0, {8}]; Do[output2[[i, 8]] = 0, {i, 8}]; :[font = text; inactive; preserveAspect] Now take the inverse transform: :[font = input; preserveAspect; startGroup] ShowImage[Chop[IDCT[output2]]]; :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 34; pictureWidth = 131; pictureHeight = 131; endGroup] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 59E3790083D0733D 54DF9A2FA1D36542 56FCF7B9FFED6941 52DDAC49B1D45D45 418095618D8E2F55 3576E5D3D4950D61 3E7DA87C9E902758 53317AE680266144 pop P % End of image % End of Graphics MathPictureEnd :[font = text; inactive; preserveAspect; endGroup] The result is a blurred letter A: the highest horizontal and vertical frequencies have been removed. This is easiest to see when the image is reduced in size so that individual pixels are not as visible. :[font = section; inactive; preserveAspect; startGroup] 2D Blocked DCT :[font = text; inactive; preserveAspect] To this point, we have defined functions to compute the DCT of a list of length n = 8 and the 2D DCT of an 8 x 8 array. We have restricted our attention to this case partly for simplicity of exposition, and partly because when it is used for image compression, the DCT is typically restricted to this size. Rather than taking the transformation of the image as a whole, the DCT is applied separately to 8 x 8 blocks of the image. We call this a blocked DCT. ;[s] 5:0,0;80,1;81,0;447,1;454,0;460,-1; 2:3,13,9,Times,0,12,0,0,0;2,13,9,Times,2,12,0,0,0; :[font = text; inactive; preserveAspect] To compute a blocked DCT, we do not actually have to divide the image into blocks. Since the 2D DCT is separable, we can partition each row into lists of length 8, apply the DCT to them, rejoin the resulting lists, and then transpose the whole image and repeat the process: :[font = input; preserveAspect] DCT[list_?(Length[#]>8&)] := Join @@ (DCT /@ Partition[list, 8]) :[font = text; inactive; preserveAspect] It may be worth tracing the progress of this deceptively simple piece of code as it works upon a 16 x 16 image. First, we observe the order in which Mathematica stores the three rules we have given for DCT: ;[s] 5:0,0;149,1;160,0;202,2;205,0;207,-1; 3:3,13,9,Times,0,12,0,0,0;1,13,9,Times,2,12,0,0,0;1,13,10,Courier,1,12,0,0,0; :[font = input; preserveAspect; startGroup] ?DCT :[font = print; inactive; preserveAspect; endGroup] Global`DCT DCT[(array_)?MatrixQ] := Transpose[DCT /@ Transpose[DCT /@ array]] DCT[(list_)?(Length[#1] > 8 & )] := Apply[Join, DCT /@ Partition[list, 8]] DCT[list_] := Re[DCTTwiddleFactors* InverseFourier[N[list[[{1, 3, 5, 7, 8, 6, 4, 2}]]]]] :[font = text; inactive; preserveAspect] When evaluating DCT of a 16 x 16 image, Mathematica begins by checking the first rule. It recognizes that the input is a matrix, and thus invokes the rule and applies DCT to each row. When DCT is applied to a row of length 16, the second rule comes into play. The row is partitioned into two lists of length 8, and DCT is applied to each. These applications invoke the last rule, which simply computes the 1D DCT of the lists of length 8. The two sub-rows are then rejoined by the second rule. After each row has been transformed in this way, the entire matrix is transposed by the first rule. The process of partitioning, transforming, and rejoining each row is then repeated, and the resulting matrix is transposed again. ;[s] 9:0,0;40,2;51,0;167,1;170,0;315,1;318,0;409,1;412,0;724,-1; 3:5,13,9,Times,0,12,0,0,0;3,13,10,Courier,1,12,0,0,0;1,13,9,Times,2,12,0,0,0; :[font = text; inactive; preserveAspect] For a test image, we provide a small 64 x 64 picture of a space shuttle launch. We use the utility function ReadImageRaw, defined in the package GraphicsImage.m to read a matrix of graylevels from a file: ;[s] 5:0,0;108,1;120,0;145,1;160,0;205,-1; 2:3,13,9,Times,0,12,0,0,0;2,13,10,Courier,1,12,0,0,0; :[font = input; preserveAspect] shuttle = ReadImageRaw["shuttle", {64, 64}]; :[font = input; preserveAspect; startGroup] ShowImage[shuttle] :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 34; pictureWidth = 131; pictureHeight = 131] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage DBD0CBD2D9E2E7E5EA99328587B4B09FACB3A378788392A1 BBD7F0FFFEFEFEFDFBF3DFD0DEEFF9FBFCFDFDFCFCF9EEF3 EDD7B9D6BFB0C49587B8C1D4D5C0C6CF DFD4D9DFE4E2E0E9ED8E98C3B8BFAD9686ACA47B808898A5 B9D4EEFFFEFEFDFDFCF5EADCE1F0F9FBFCFCFDFDFCF9EFF5 EFCBBDDC9C838A8D96A69FAABFC8CBD2 D9D8DADEE2E6ECBDD571A394A3B58C73998AA07A818C9BA7 BCD6ECFEFEFEFEFCFCF7EDE5EAF2FAFBFDFDFCFDF9F8F0F6 EFCCB9BB9D91918798A4A9B6AFC7CACC DFE2D9D7DBE5E14B545A7866A9AC8789B0789C79818C98A8 C2D5E5FCFEFDFDFCFBFAF5F1F1F6FAFBFCFCFBFCF8EFCEE5 EAC2B5B1A09CA09E9DB8BDC2B8BDCACF E0E6E1DBD9E4D31D335F4467A6A4ADB2BD86A07C838996AB C7D4E5FBFDFCFCFCFBFAFAF9F9FAFCFCFDFDFDFCF9E9D6E2 CDBCB8A09588A7ADC4BDC1CCE2BBB2CA E5E4DFD6D6E2CC18524D3C60C1A1A0BFBEBBA781848F99AC CDD3E2F8FDFDFCFCF9FAFBFAFAFBFBFCFBFCFBFCEFE4DCC9 BDBDB09B919AAFB5BEB6C6CFE0D9C4C9 E7DEE1D8D4E19A197D667587C1B2B6B19EB6A9838C929DB0 C9D3E5F8FEFDFDFDFCFBFBFCFCFCFCFDFDFCFDFCEBD8C9B9 B1B5A0989E9FA8ADACB1AFC2D8E4DBD6 E5E0E1EBEFD82F145E915280A998BDB884A4A4868E969FAF C6D2E2F5FCFDFCFCFDFBFBFBFBFCFCFCFCFCFBFCE9D8C8B7 B2A8A1A0A1ABACABB9BF9FB5D7D0C8D9 E9E7EAECEADE3E122C3C4A6FCFA7C4CFAB94A1899299A3B1 C7D0E2F1FDFCFDFBFBFCFAFBFBFBFCFCFBFAFCFAE9D9CBBE B7B2A89CA3B2AFB0BEC4B5CCE0D6D7DE E7E6E9ECD64B1D123E468773B185A7CACE8E9F91939DA6B9 C4D3E2F1FDFCFDFCFCFCFBFBFBFBFBFCFCFCFCF8EADCCFCA C3B7B1ABA7A8A1B5CCCDCED7DBDAE2E7 E7DFDFEC6A14190E346C8D778D669CADB88CA19499A4AABB C0CDDFEFFCFCFCFDFCFCFBFBFAF9FBFCFBFBFBF7ECE2DBE4 DBBECFC6BDB2ABB9BFCDD5D2D4D6E3E5 DCE9CFC72615160D61523147AF9C96A3ABBBAF959BA5B0B8 BECCDBEFFCFBFCFCFCFBFBFBF9F9F9FBFBFCFCF6EDEBEBE2 C9BCDCDEDFC89EB0B7C2D2D9D5D8E5E4 DBD26A1C0F0C080C67467C819F8298B59EAB9C9A9DA7B1BB BFC6D6EEF8FAFBFAFBFAFAF9F7F7F8FAF8F9F9F1EDEEE7C0 B5C9D7E4E9D6CEB0B0C0D5D8E2DEE1E2 E9C22F1A1411100C3F276567857B8F9B839885949EA8AFB6 BEC4D3E9F1F9FBFBFBF9F9F6EBEDF5F2F2F5F2EDE9E9C8AB B1D5E4E7ECEDECCA93B1B8CCE4E3E3D0 E6A4183D111113104021803B84797AA59D8C867A8A9995AA B2B4C6DBE3EFFBFBFBF8F6F2E5EBECE9DCEAEDE6EACBB2AC AFC0DADBE3ECDF9E8691A7CFD9D5CA77 E271151B211D16143037535275423E7B99858E7384676079 808186B5D0ECFAF8F9F6F3EFE5E2DBD8CDDEE3EBCFB5AFAB A7A3B3CEDBDC9C8F8A858C9FB29A7159 6943131F2626130A15483C38603331799B84696B6A5A6778 77759FDED2DCC3C8CBCEC9E5E1D6CADCD0E3E4C4B6B2ACAB A9A4A5B0CAAB98948D848280776D6259 152D0C050D301011262B252B933E1E607B77405247435460 555AA0EEF1BD95C39ABB76ACE1DACBD5C8DFE2B7B4B3AFAA A6A3A19E9B958F89807B776F69645E54 1F40100A0910111223342427907A5C693B7848545E5B444D 4E5C9AEFEACD78969ABB7D88E6E2D5D3C1DFE0B5B4B1ADA8 A49F9D9B98938F86827B776E67645C56 27320C0A113578A0ACB2B1718C856A5950783E353C384167 788A88DEEBDB7AA096D8D688D2DBDAD6C0E2E3B2B0ADABA6 A39E9B9895908C8683817B736E6B635A 1F340E180C96A193F7FEEEAAAB7E72675C65524F3944438C 929691A5F5F6A6DAECF2E789DBD8C7B5B6E0E3ADAFADA9A7 A49F9C96938F8A8683818079706C695F 3D56472B189F7054F7FFED5F57285C615E563D392A3D486D 756E7289C4F5B1DAEDF2EE628FA8B6A8C3BDBEAFADACAAA8 A7A19F99918E88817E7878766E6A635B 6964200C0E868AD7EED85A143D1A6E424E4E302A34333C8D C0C2CDC7A3E39AD8EEF1EBA086796665596379B3AFABAAA6 A49F9D96928F8885807677736D665F57 30470F050D2D1F3C282012142C18273E46493F4442363D54 ADB9CBBEA6A39CCEEDF2EADAE4E0D8CBBDAD84B5B2AFABA9 A5A39F9A98948C87817B736F6B625B57 41411B0F0719161812163757343C4A7B4C63489396818A85 70AAC6B8B3A7AACCE5F2EADCD2CAC3CCC3B0B1B5B4B2B0AC AAA6A19D9A958D88867C777067625B5A 5864282B18494716091D3B3C474F67678D7962AAAB9EB3B1 A47BB7C3C4BEC6E0EFF6E5DFDED4CAC4B686DCB7B8B6B4B2 B0ABA9A19D94918C867E7B716B645E59 64722A4A213856120A1B2F0934475472A68E5FA3A7ACABAC AD9D89BBC1C0C8E0EEF7E7E0DED5CDB986D6E9B8B6B6B5B4 B2AFACA6A39D95928D868379736D6762 75752A3E25331302031008092C234E57646761A5A7AAA8A8 ADB19696BEC0C8E0EEF7EAE0D9CFBF81A4E7E6B4B4B2B2B1 ADADABA8A39F9995938D88817C766F6B 6C7026060C060301030E070728254239463F62A4A0A5A6A8 ABAFB38AA9BEC7DFEDF5E7DBD6C7878FB185E6B0ADACAAAA A8A8A3A09D9E9A95908D86817D79716C 6C7130130E554C04040A06043325496F5E6F6DA19DA09FA4 A8A9ABB099BFC8DFEFF5E6DCD08F7C91BC96EAB0ACAAA9A9 A9A6A09C9B9592908D86827D75706C6A 737841441A7D7607051106072C4864796C9A729D989C9DA3 A4A9ACADB1BCC7E0EDF5CC8F92B98494C0EEE7ADAAA9A9A9 A8A7A39F9A93908989867E7A73716C69 838648571E70630C020A0306364A5A6F939C6E99969B9DA0 A6AAADB1B2BCC6DFEEF5AC337CE38698C6EFE6A9A7A8A7A6 A4A4A49E9A94908987827D7A7977736F 858549582C35400801050406271B54567893789A969A9EA3 A5AAABACAFBCC6DFF0F6B532A5EA889DC9F0E7A8A8A5A4A1 A3A1A09E9A98918F88847E7A78757773 8A8C4931150A040505030307211C543833304B9E9A9C9EA1 A5A8A9A9ADB9C4DFF0F6B830B7E989A4CEF1E9A9A7A5A6A5 A3A19F9B989894938F8985847B787A78 8D8E4A0912291E0706070A1B2325471B191A37A39B9D9FA3 A5A6ABACB0BDC8E0F0F7BF33CBE98AA7D3F3EAA9A8A5A6A5 A4A0A09C9894918F8F8A898783827E7A 888E5A431679850E0507061C231F37372631379FA09FA1A4 A7AAACADB1BEC7E2F0F6C438E0E9889CC9EEE7A9A7A6A5A5 A59F9E999693908C8A8A88858583827E 908D5C651D95910D0505070C3E2B7D5B8863265B8AA4A5A9 AAAFB0B0B3BCC9E3F0F6C748EDE98CACD5F1E9ACA8A7A6A6 A4A0A09A999693908A87868485858483 96955B64304C65150406060A4B1F21716D40236C7DA5A8AB ADB1AFB2B5BCC6E4F2F3CB5CF0E98EACD5F2EAB0AAAAAAAA A7A4A4A09E9D98928F8E8E8987878685 9B9A4F37210F090603040606151C18202B1B269690A4A9AD AFAFB0B2B4BDC9E4F2F7D36AEEE689AAD5F2E9B0ACACB0AD AAA7A7A39EA09D989594918D8C8A8886 9D951F0A0907080D09162C3C392D1C345E7C894F9EA7ACB0 ADADB0B2B3BDC7E4F2F8D892F0E487ABD5F5EBB1ADACAFAF ABA9A6A5A3A09D9B9694949391908D8D 9690311B0907060A0831578057659F986D341876AFA5AAA9 AAA9AFADACB6C3E2F3F7DBB6EEE785AFD7F3EAB1ABACACAD AAA7A6A4A09E9A989592908F90918D8E 92754162230D071A1FA088C2B396717677491998B1A5A3A5 A5A8AAABA1A6BDE3F3F6E0C8EEEB82AAD3F3EAADABA9A9A9 A7A5A4A39E9B98959492908F8E8C8A8C 8F60438638070E1B806FA6DB712443887E7119A9A5A4A39F 9FA1A3A59D7882E0F2F5E2CAEEE6779FCFF3E7A9A6A4A4A4 A3A09E9F9B9A959292908C8989888685 8D8E637E3008072BA860A7E38D2B283E356015A09D9C9A9B 9D9E9FA0946790E3DCF3B4C9EDE56D92C0EEE5A4A1A1A0A0 9C9B9C9B9895918F8D8C8C8886858280 8A8A612C0C06021492A4DE8632181C0C0E0E189B9A98989A 999A9C9D90603E83ABD836C8ECE46795C6F2E49F9EA0A09E 9C9A99989592908D8A88878683827E7E 898C754A392B09051C2F2D08121D293C6C77759896959595 94989698854F489EE6BF26C4EDE5638EC0F0E29C9B9C9C9C 9B99969490918D8C8987878884818282 86878788888D5211000203020A2F35A0A19C9A9695939291 8F91949485574467D68121B0E5D44376B4EEE09696989899 9596948F8D8E8D898885878989878383 83858687878A8C2C0E1313131652789D9C96928F8C898882 8285878C7C53441CB2331FB3DBD5407AB7ECE092908F9092 92918D8A88898A858584848285868382 8084858687868A591815161E20358E918D8C868381817C79 77777A7B6F413913121836BDDED63C80B7F1DC8A89898A8A 89878383828381807D7D7C797C7C7A78 8482807E7D7C80761810111C19478A8782807C7975767271 716E6D6D6E38281A262469A0CFD93970B1EFDB827E808582 817D7B7A79797571727172737372706F 807B78736F6E70734710110C14677D7B7976716D696B6766 6566676A6D492024283072A4CFE25F50A1E9C379777C7B78 77716F706F706C6764656A6766656669 7C7A726C6C6A69676139080E436D6B6C6B6966645F626061 5B5C65676A5B154B32397CB2E3E9987791EC916564666A69 6C6A65656567636160615C585657595B 77726D6767676362626415316A655F605E5E5C5A5A5C5E5E 5C5A5E61676A2D592F3887ADE6EDC09A87E15E5655555B5E 60615F5F616160605C59554F4C4C4A4B 6D6B67646361615E60616CBF64615E595855545553555857 58565659606764552B368AB1E7EBE0B785B14B494A4B4B4F 535556585E5F5B5853524E4C48464243 656364605E5A5B595B6069CF615F5E5C5957575550505352 505352565B5F6450263189A7E6EBEDC4656E4A4947474747 484B4E50575958564D4A4843413E3B37 615F605A59565354565A63D35B5A575656555958534F4F4F 4D4D4F4E4E5059522129859FE3EBECB14C4B484747464442 41434646474D504C47423F3D3D3B3832 5B5857524F4E4F4E4F545BD65650504F4F50555752504D4F 4E4C4B4B4B4B4E501F247B9BE0E7ED8E464342424241413D 3E3D42413D4143403C3C3D3C39373430 544F4F4A48464844484B52D64E4B484B4E4C4D504E4D4B4D 4D4A4B4C4A484B4F2A1E7093DFE6EC5F413E3C3C393B3B38 3B393C3F3D3E413B303130302D30312D 4B484844413F3F40434457D84B4A49494A484A4A4947484A 4B4A4A4C4C4B4D4D39155E93E0E4C9413E3B363534363433 3434373D3C3837312A2A2A292826272A 423F3F3E3C3C393F3E414BDE4A48464648434242413F4344 47474749494948484215428EDBE28139373431313332302F 3030343434302D2A2627262525242425 3B3938383535343B383C4AD643413E3D3D3C3B3C38383D3D 3D3D404242444342412D2B8CE3CF4034312F2D2D2C2C2C2B 2D2D2C2D2C292825242323232423201E 333333323233302F313540E03F3835353433323230303234 3736393C3C3F403E3D3D2679E26A3432302D2C2C2A2A2929 2A2A282827272424232121202121201E 2F302F2D2F2D2A2C2C2F3EE23C33302C2B2B2C2B2B2B2C2C 2D30313336383B3C3B393755873832312F2F2C2B2A282828 2928272726242321211F201E1F1F1E1D 2C2D2B2B2A2A2A2A2A2A35DF382A29282625262628272828 29292A2C2D2F32353534353E3532312F2D2C2A2B29272727 26282725242120201E1E1D1C1D1D1C1A pop P % End of image % End of Graphics MathPictureEnd :[font = output; output; inactive; preserveAspect; endGroup] Graphics["<<>>"] ;[o] -Graphics- :[font = text; inactive; preserveAspect] Applying the DCT to this image gives an image consisting of 8 x 8 blocks, each block a DCT of 8 x 8 pixels: :[font = input; preserveAspect; startGroup] ShowImage[DCT[shuttle], {-300, 300}] :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 34; pictureWidth = 131; pictureHeight = 131] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage FFCC3FB85D937882FF4281AE927A7C83FF85A871757A8B8A FF465E7680807E7DFF7D8E837D7F8080FFA6707F837D827D FFB29782888C797EFF58737F84767C7D AC35B3618F7E7B839AB28D9687988F757482827F7F828181 827E7A797C7F7F7F6E7E8E837C7E7F809668887F817B827F 96A277848A8C7A7B6E7A7C7179827D7E 7D7D85719C699376A094988B898B727383807A7773747579 7F7F7F7E7E7F80807A7E85827F7F80807C837E817D837D80 877774857F817A7B80747F847E7B7B7D 7F7D8587718C768472648D888977747988908A82807D7E7D 80818180818080807F7E7F807F7F8080807F7F807E807E81 8675837C7A7E7B828E88717D857E8184 758D7585807B807D666D897C75726F757B7D808386868582 7F8080807F7F7F7F807F8080807F7F7F7E827F7F827C827F 89777F857E817F83838A7D77857A7B81 7E7C848478867C81778580867D8089838182838281818180 808080807F7F7F807F7F8080807F7F7F7D837E80807F817F 867B7F897B7D7E8082797B7978847E7D 807D807F817D7F7F71818A86827B7E7E818282818081807F 7F8080807F7F7F7F7E7F80807F7F7F80827C81807D827E80 847D80847A80808081847C7D8081817E 817C817D7F80807F848585827D877F7D7F7E7F8081818181 80807F7E7F7F7F80807F8080807F7F80827E817F80807F80 7D807F807E7E7E8380817E81837F8080 FFFF95929181736FFF167374956E87A2FF779B80847D8985 FF316A8183817D7FFF89827E7F81807EFFB3697F7D817F7F FF8760877D808581FF5F62867E807982 FF9B1C607B7F8A85AE647C837C7B6F809C7D888081898582 A395797B7E7C808291757F80807D7F809D7E897F8182817F 638CA377897D8380BA799D73847B817E 9D6061A88D7989836E77777681798183628C808288828786 6B7284837F817F7F77857E807F80807F668A7878857E7F7F 5F7B88897C7F817C528F768E847E7E7E 7E738CA16F69837E90687C89838A8582876F7D807B7D797A 8F8C7F7D7F808180827D817F7F807F7F8187798A7A818080 9070817D71817581946E7D827E7D7C7F 837680876F7E8E7D7D7E80958C7876787B8C7C797A7A7C81 75777F83817F7E7F7F807E80807E8080807C817D7E847D7F 72827784857B837D7188837E857C837F 8F8277797B8D806D7C73869279787F81837B817F7A7D7F7F 8685807D7F808080807F807F7F807F7F817E807E827C8081 86817D807C828282807A78847C857B7F 7F7C82857C82837E76847A787D827478797C787D807F7D80 7C7C7F81807F807F7E80807F80807F807F8080808081807D 847D847E817F807F7A7E867D8179807F 777D86847E7E81808B867E6D7C8482837F7D818181828280 8081807F80808080807F8080807F7F7F7F7F7F7F807F7F81 808081827C847C8280827C807E817F81 FF57BF9065758265FFB69B82805C789AFF87A8738B6C7974 FF4041839C6C986BFF8E908F68617F8DFF9A7B7672797F81 FF9C7985817F8081FFA97B847F828080 4EA565838D82768A653C5280906B897CA48F798A7B81777F 71664E80918977818140718B91777374A5A286726F7A8587 8C7B7983837D7E8183837F807F80807F 66B076888E7681830649867D9379777B8A847D8786887F86 8B8D916679927E828D8A7079978F7A6E75707C898E857B78 8B7D7A82827D80817D827F80827F7F80 AD738090728B8B77C2C1986577827C859180927D87878781 8A639892757C84817AA78E7579878B867F7F7D7C7F818381 857F7C81827E7F81877E7D7F8081807F 7C77857F8A8478848B7B6A747F8688758B847E7B81818182 8B8989837E7D7882AE76747A7F8384838D8F867F7D7C7E7F 867C7C82827D7F8187817F7F807F7F7F 9A7B9B798E7E7E84868899877184777E807C837F7F777F82 858F7F82798583726C947D6F7B838480716F757D83837F7E 827E7D81817E7F8082807E808080807F 6DA465847B827D826F6B78717B80867E8382708479827F80 6D717D857C827E828F7089847C8081848D8F8A84817F8080 837F7D81807F7F8080808080807F807F 857B888480807E7B8774818D817E777C8979787B827B847E 8D87817E7B7F84807E8E798889807F7E7876787C7E7E7F7F 817E7F80807F7F8081807F7F80808080 FFC4A3A8598B6C65FF20967580757D88FF3E6E8D96816A6C FF4B8F738679857FFFD3858E6F6B877CFF9977666A7F9191 FF9D7D827F808080FFA6818380808180 5C79807193757E86968C71708188847C78797D878A847C81 7B7C707B867F8083B66A68718D9170837B6B77868985807E 84828080807F80807386807F80808080 8F6C7C81758B837B99767B7A838386777C9489807D79777E 7D816E708183817F6E6FA38672738B7D82898A8A847D797A 77837E8080807F80727E817F8080807F 5F7D8A7E7E7588897C867C7989847D7C65716E747D808082 79857E72737E8480818D706B94827B807479818B91908C86 7A7E8181807F7F7F7C81807F8080807E 6A9080769074858274877B8084837C7C6B76767D80818181 7B85817C75747E84797D828B747C867E7F848585817D7B7C 7F7D7F807F80807F857D7F81807F7F80 867C78828084807C807C887B837F807D79857E7E7A797B7C 7D817F7F7E78787C7F817E7C7C877B80898A857D756F6E75 80817F80807F807F8081807F80807F7F 7D7E827D80817C817D80847B847A85817D868384807E807E 7D82807E7F7F7A77817F7F7B857E7D837E7E7E7E7D7D7D7D 7F7F8080807F8080807F807F80808080 7980837982817B847F8280817A80847E7C8080808080807F 7E81807F7E7C7E80807B837F7E7C857B7D7D7E7E7E7E7E7E 807F80807F80807F807F7F807F7F7F7F FFF6B1A15A8D6A6BFF3C877E867D738DFF076E9696847470 FF509771857A847CFFC0B0D35419AFA2FFCC93665B6D828A FF937E827E818180FF8F81817F818080 7E7A767D7C8282817C738B84778B748584876C7486857A78 797D7F807D80807F647D9B896C7D857D77827E7E7E7E8080 76817F7F807F807F6C84818080817F80 559C8872A0687B867B8B7B7B7F7D857B95927F7070788489 7F8080808080807F80837F7880897F74827E7F7F7F7F7F80 867E7F7F807F7F7E8182817F80807F7F A3746A7E7E937979836B907D87747F8887929A8F83817D78 8181807F807F7E7F7E7D83817E7F80807F807F808080807F 807F7E807F80807F797F817F7F7F7F80 926A7D8D708F7D778E797F7B7F837C80989D9180706F7F89 807F7F7F7F7F807F80827C7F80817F7E7D7F7E7F7F7F807F 7E807F80807F7F807E7D7F80807F7F80 83807C7E7E7F7F836E8A7F807F7E84797A736C7787877A76 807F7F807F80807F7D8180817D7F80817E7E7F7F7F7F7F80 7F817F807F80807F7F807F807F7F7F80 817A83837F7F7D82897F7A7B8778827F878B8A80787B8283 807F7F7F807F807F817F7F7E81817F7E8081807F807F8080 80807E80807F7F7F807F7F807F808080 7B837F827F7C847F807C8186758A798380818584827F7E7E 807F7F7F7F807F80807E817F7F7E807F8181818080807F80 807F807F7F8080807F7F8081807F8080 FFFE888486847572FF7B724A8E878078FF306DA2A5836668 FF99865B9F71837FFFAD56D9B6458E53FFCE946255688189 FF8F7E817F81807FFF887F81807F807F 4197A372997D7974E095497189886F7A6C4F7F9D99807275 CF4C9B797E80827ED4A78C524F758A98977D7F848684807F 95827D7F8180807F8C8281807F7F7F7F 9C69769871837C84630E978C6F71777598A094857B808C90 817E74926D8B7C806F7780838A8E948D7F80807F80808080 808081807F807F80857C8081807F8080 609495836F6E878451788B8662798085746D7A7C7F82898A 8681807F817C847D807A8A8D84766C73847E808180807F7F 8381807F807F8080807F7F7F81807F7F 7B7F937B757B7B8290947E807B9583876568767F817F7E7F 7A8479877A847D817473797B7E7E7E7E7E80807F7F80807F 7E7F7F8080807F807D7F7F807E7F807F 8D7F7383827E7E7C68688C7E9E8B86818D8D887F797A7D7F 88778879847E7F81858D827F7C7F84867E7D7E7F7F7F7F7F 807F7F7F7F7F807F817F7E8080808080 7581847F82817D836C79907B838C7F85848784807D7F7E7F 7B81807D847D80808580828081828281808181808080807F 7F8080808080807F7E8081807F7F7F80 7B7B81867D818182828F8F6B7B8586817A787E8285858280 768C7584807C847E777A7E7F807C7C7D818080807F807F7F 807F80807F807F807F7F8080807F807F FF8F7F837C827E81FF4C92828C96746AFF8A82807F81807F FFA5648587788380FF0000A78A779C7FFFCAA1735C5F6B78 FF7F7E837E7F807FFF8B81807F7F8080 A87F7C837C837C803E43BB8E6B778698B28580827F7E807F 81AC6C7E877C7E8347AA658B99689163EB9B826D69778488 B98A81818180807FC1787F7E7F7F8080 817E78817C837E81847A6D5B84957A798D837D7F80807F80 7D868280788D72887174817D8C7A817A7D71717C868F918B 837D807F7F807F80867F7D827F807F80 83807A837C827D808E887374847C7581827C80807F7F7F80 8B7A82837B847D808A70847A8A7E7B7D80868985837B787A 887E7F7F807E7F8085838080807F807F 7E827C827D807F80787F898D81707A85827F7E7F7F7F8080 80807F7C837B867B817A7D8383817A7D7D7D7F7F7F7C7B7D 7F80827F7F807F7F7F8082817F7F7F80 7E817E807E807E80838181808184847F808180807F807F7F 827E7D7F7E807F7F827C7E8182817A7D807E7E8080818280 827E7F80807F807F817F807F7F7F7F80 7E807F807F807F7F83837D7B8087857E7F7F7F8080807F80 817F80817C837E807C807C827E827C7E81808081807F807F 7F8080807F807F7F807E7F7F807F8080 7F807F7F7F80807F7B7D86857E7A7F81818080807F7F7F80 80817E817F7F807F7D7F7E817E807F7F807D7E7F80807F7F 817F807F80807F807F807F7F7F808080 FF87827F807F8080FF91274CB9C46333FF80807E81818080 FF79807F81807F7FFF2C0EC98C817C91FF86818180807F7F FF837C807F817F80FF847F807F808080 A984817F7F8180819F7E8A8378798386AE817E7F8080807F A084817F80807F80E1375F96639B858B987F80817F808080 9F7B7E7F7F827F8099817F7E7F807F7F 84817F807E807F807D827F80817F7E807C7F7C807F7F807F 777E827F807F7F80727BA2596D8E788987807F7F7F807F80 857E827F7F80807F88817F807F807F7F 837F7F807F7F807F828080807E7E7F8081807F7F7F807F7F 817F7F807F80807F8A80747E916A7981817F7F7F7F807F80 8080827F7F80807F85817E817F808080 827E817F807F807F817F81817F7F7F808080807F7F807F80 7E807F807F7F807F7D7C83817D7E8D72807F7F80807F7F80 7F80807E7F7F808081817E807F7F7F7F 817F7F80807F807F837F7E7F7F807F7F80807F7F7F7F8080 827F7F807F7F7F7F7F7F827B82817F8481807F807F7F7F80 80807F7F808080808180807F807F8080 80807F807F807F7F8080807F7F8080807F807F7F807F8080 808080807F807F80817F7E7F837F7C81808080807F80807F 7F7F7F7F7F7F807F80807F7F807F8080 8080807F807F7F7F8080807F7E808182807F7F7F7F808080 807E7F807F7F7F8081807F807D7F837C8080807F7F807F7F 80807F8080807F7F80807F7F807F8080 pop P % End of image % End of Graphics MathPictureEnd :[font = output; output; inactive; preserveAspect; endGroup] Graphics["<<>>"] ;[o] -Graphics- :[font = text; inactive; preserveAspect] The lattice of bright dots is formed by the DC coefficients from each of the DCT blocks. To reduce the dominance of these terms, we display the image with a clipped graylevel range. Note also the greater activity in the lower left compared to the upper right, which corresponds mainly to uniform sky. :[font = text; inactive; preserveAspect] The inverse DCT of a list of length greater than 8 is defined in the same way as the forward transform: :[font = input; preserveAspect] IDCT[list_?(Length[#]>8&)] := Join @@ (IDCT /@ Partition[list, 8]) :[font = text; inactive; preserveAspect] Here is a simple test: :[font = input; preserveAspect; startGroup] shuttle - IDCT[DCT[shuttle]] // Chop // Abs // Max :[font = output; output; inactive; preserveAspect; endGroup; endGroup] 0 ;[o] 0 :[font = section; inactive; preserveAspect; startGroup] Quantization :[font = text; inactive; preserveAspect] DCT-based image compression relies on two techniques to reduce the data required to represent the image. The first is quantization of the image's DCT coefficients; the second is entropy coding of the quantized coefficients. Quantization is the process of reducing the number of possible values of a quantity, thereby reducing the number of bits needed to represent it. Entropy coding is a technique for representing the quantized data as compactly as possible. We will develop functions to quantize images and to calculate the level of compression provided by different degrees of quantization. We will not implement the entropy coding required to create a compressed image file. ;[s] 5:0,0;118,1;130,0;178,1;192,0;680,-1; 2:3,13,9,Times,0,12,0,0,0;2,13,9,Times,2,12,0,0,0; :[font = text; inactive; preserveAspect] A simple example of quantization is the rounding of reals into integers. To represent a real number between 0 and 7 to some specified precision takes many bits. Rounding the number to the nearest integer gives a quantity that can be represented by just three bits. :[font = input; preserveAspect; startGroup] x = Random[Real, {0, 7}] :[font = output; output; inactive; preserveAspect; endGroup] 2.784521442780606 ;[o] 2.78452 :[font = input; preserveAspect; startGroup] Round[x] :[font = output; output; inactive; preserveAspect; endGroup] 3 ;[o] 3 :[font = text; inactive; preserveAspect] In this process, we reduce the number of possible values of the quantity (and thus the number of bits needed to represent it) at the cost of losing information. A "finer" quantization, that allows more values and loses less information, can be obtained by dividing the number by a weight factor before rounding: :[font = input; preserveAspect] w = 1/4; :[font = input; preserveAspect; startGroup] Round[x/w] :[font = output; output; inactive; preserveAspect; endGroup] 11 ;[o] 11 :[font = text; inactive; preserveAspect] Taking a larger value for the weight gives a "coarser" quantization. :[font = text; inactive; preserveAspect] Dequantization, which maps the quantized value back into its original range (but not its original precision) is acheived by multiplying the value by the weight: :[font = input; preserveAspect; startGroup] w * % // N :[font = output; output; inactive; preserveAspect; endGroup] 2.75 ;[o] 2.75 :[font = text; inactive; preserveAspect] The quantization error is the change in a quantity after quantization and dequantization. The largest possible quantization error is half the value of the quantization weight. :[font = text; inactive; preserveAspect] In the JPEG image compression standard, each DCT coefficient is quantized using a weight that depends on the frequencies for that coefficient. The coefficients in each 8 x 8 block are divided by a corresponding entry of an 8 x 8 quantization matrix, and the result is rounded to the nearest integer. :[font = text; inactive; preserveAspect] In general, higher spatial frequencies are less visible to the human eye than low frequencies. Therefore, the quantization factors are usually chosen to be larger for the higher frequencies. The following quantization matrix is widely used for monochrome images and for the luminance component of a color image. It is given in the JPEG standards documents, yet is not part of the standard, so we call it the "de facto" matrix: :[font = input; preserveAspect] qLum = {{16, 11, 10, 16, 24, 40, 51, 61}, {12, 12, 14, 19, 26, 58, 60, 55}, {14, 13, 16, 24, 40, 57, 69, 56}, {14, 17, 22, 29, 51, 87, 80, 62}, {18, 22, 37, 56, 68,109,103, 77}, {24, 35, 55, 64, 81,104,113, 92}, {49, 64, 78, 87,103,121,120,101}, {72, 92, 95, 98,112,100,103, 99}}; :[font = text; inactive; preserveAspect] Displaying the matrix as a grayscale image shows the dependence of the quantization factors on the frequencies: :[font = input; preserveAspect; startGroup] ShowImage[qLum]; :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 34; pictureWidth = 131; pictureHeight = 131; endGroup] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.119048 0.0238095 0.119048 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 8 string 8 8 8 [8 0 0 8 0 0] { currentfile 1 index readhexstring pop } Mimage 0D02000D20455E75 04040914246E7367 09060D20456C886A 09101B2B5EB1A177 121B3E6A85E4D69A 2039677CA3D8EDBD 597C9CB1D6FFFDD1 8EBDC4CAEBCFD6CD pop P % End of image % End of Graphics MathPictureEnd :[font = text; inactive; preserveAspect] To implement the quantization process, we must partition the transformed image into 8 x 8 blocks: :[font = input; preserveAspect] BlockImage[image_, blocksize_:{8, 8}] := Partition[image, blocksize] /; And @@ IntegerQ /@ (Dimensions[image]/blocksize) :[font = text; inactive; preserveAspect] The function UnBlockImage reassembles the blocks into a single image: ;[s] 3:0,0;13,1;25,0;70,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,10,Courier,1,12,0,0,0; :[font = input; preserveAspect] UnBlockImage[blocks_] := Partition[ Flatten[Transpose[blocks, {1, 3, 2}]], {Times @@ Dimensions[blocks][[{2, 4}]]}] :[font = text; inactive; preserveAspect] For example: :[font = input; preserveAspect; startGroup] Table[i + 8(j-1), {j, 4}, {i, 6}] // MatrixForm :[font = output; output; inactive; preserveAspect; endGroup] MatrixForm[{{1, 2, 3, 4, 5, 6}, {9, 10, 11, 12, 13, 14}, {17, 18, 19, 20, 21, 22}, {25, 26, 27, 28, 29, 30}}] ;[o] 1 2 3 4 5 6 9 10 11 12 13 14 17 18 19 20 21 22 25 26 27 28 29 30 :[font = input; preserveAspect; startGroup] BlockImage[%, {2, 3}] // MatrixForm :[font = output; output; inactive; preserveAspect; fontLeading = 0; endGroup] MatrixForm[{{{{1, 2, 3}, {9, 10, 11}}, {{4, 5, 6}, {12, 13, 14}}}, {{{17, 18, 19}, {25, 26, 27}}, {{20, 21, 22}, {28, 29, 30}}}}] ;[o] 1 2 3 4 5 6 9 10 11 12 13 14 17 18 19 20 21 22 25 26 27 28 29 30 :[font = input; preserveAspect; startGroup] UnBlockImage[%] // MatrixForm :[font = output; output; inactive; preserveAspect; endGroup] MatrixForm[{{1, 2, 3, 4, 5, 6}, {9, 10, 11, 12, 13, 14}, {17, 18, 19, 20, 21, 22}, {25, 26, 27, 28, 29, 30}}] ;[o] 1 2 3 4 5 6 9 10 11 12 13 14 17 18 19 20 21 22 25 26 27 28 29 30 :[font = text; inactive; preserveAspect] Our quantization function blocks the image, divides each block (element-by-element) by the quantization matrix, reassembles the blocks, and then rounds the entries to the nearest integer: :[font = input; preserveAspect] DCTQ[image_, qMatrix_] := Map[(#/qMatrix)&, BlockImage[image, Dimensions[qMatrix]], {2}] // UnBlockImage // Round :[font = text; inactive; preserveAspect] The dequantization function blocks the matrix, multiplies each block by the quantization factors, and reassembles the matrix: :[font = input; preserveAspect] IDCTQ[image_, qMatrix_] := Map[(# qMatrix)&, BlockImage[image, Dimensions[qMatrix]], {2}] // UnBlockImage :[font = text; inactive; preserveAspect] To show the effect of quantization, we will transform, quantize, and reconstruct our image of the shuttle using the quantization matrix introduced above: :[font = input; preserveAspect] qshuttle = shuttle // DCT // DCTQ[#, qLum]& // IDCTQ[#, qLum]& // IDCT; :[font = text; inactive; preserveAspect] For comparison, we show the original image together with the quantized version: :[font = input; preserveAspect; startGroup] Show[GraphicsArray[ GraphicsImage[#, {0, 255}]& /@ {shuttle, qshuttle}]]; :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 32; pictureWidth = 285; pictureHeight = 134; endGroup] %! %%Creator: Mathematica %%AspectRatio: .47619 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.47619 0.0113379 0.47619 [ [ 0 0 0 0 ] [ 1 .47619 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 .47619 L 0 .47619 L closepath clip newpath p p % Start of sub-graphic p 0.0238095 0.0113379 0.477324 0.464853 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage DBD1CCD2D9E1E6E4E89E408C8EB7B3A4B0B6A780808A98A6 BDD7EEFCFBFBFBFAF8F1DED1DDEDF6F8F9FAFAF9F9F6ECF1 EBD7BCD6C1B3C69B8EBBC3D4D5C2C7D0 DED4D9DEE3E1DFE7EB949DC5BBC1B19C8DB0A883878F9DA9 BCD4ECFCFBFBFAFAF9F2E8DCE0EEF6F8F9F9FAFAF9F6EDF2 EDCCBFDCA18A91939CAAA4AEC1C9CCD2 D9D8DADDE1E5EABFD57AA79AA7B8927C9E91A5828892A0AB BED6EAFBFBFBFBF9F9F4EBE4E8F0F7F8FAFAF9FAF6F5EEF3 EDCDBCBDA297978E9DA8ADB9B2C8CBCD DEE1D9D7DBE4E0575F658070ADB08E90B380A18188929DAC C4D5E4F9FBFAFAF9F8F7F2EFEFF3F7F8F9F9F8F9F5EDCFE4 E8C4B8B4A5A1A5A3A2BBBFC4BBBFCBD0 DFE5E0DBD9E3D32D41695171AAA8B1B5BF8DA5848A909CAF C8D4E4F8FAF9F9F9F8F7F7F6F6F7F9F9FAFAFAF9F6E7D6E1 CEBEBBA59B8FABB1C6BFC3CDE1BDB5CB E4E3DED6D6E1CD285D59496AC3A6A5C1C0BDAB888B959EB0 CED3E1F5FAFAF9F9F6F7F8F7F7F8F8F9F8F9F8F9EDE3DCCA BFBFB3A0979FB2B8C0B9C7D0DFD9C6CA E6DDE0D8D4E09F2985707D8EC3B5B9B4A3B9AD8A9298A2B3 CAD3E4F5FBFAFAFAF9F8F8F9F9F9F9FAFAF9FAF9E9D8CABC B4B8A59DA3A4ACB1B0B4B2C4D8E3DBD6 E4DFE0E9EDD83D2568975D87AD9DBFBB8BA8A88D949CA4B2 C7D2E1F2F9FAF9F9FAF8F8F8F8F9F9F9F9F9F8F9E7D8C9BA B5ACA6A5A6AFB0AFBCC1A4B8D7D1C9D9 E7E6E8EAE8DD4B233B495678D0ABC6D0AF9AA690989EA7B4 C8D1E1EFFAF9FAF8F8F9F7F8F8F8F9F9F8F7F9F7E7D9CCC0 BAB5ACA1A7B5B2B3C0C6B8CDDFD6D7DD E6E5E7EAD6572D234B528E7CB48CABCBCF94A49799A2AABC C6D3E1EFFAF9FAF9F9F9F8F8F8F8F8F9F9F9F9F5E8DCD0CB C5BAB4AFABACA6B8CDCECFD7DBDAE1E6 E6DEDEEA7325291F4275937F9370A1B1BB92A69A9EA8AEBD C2CEDEEDF9F9F9FAF9F9F8F8F7F6F8F9F8F8F8F4EAE1DBE3 DBC0D0C7BFB5AFBCC1CED5D2D4D6E2E4 DCE7D0C83526271E6B5D3F53B2A19CA7AFBDB29BA0A9B3BB C0CDDBEDF9F8F9F9F9F8F8F8F6F6F6F8F8F9F9F3EBE9E9E1 CABEDCDDDEC9A3B3BAC4D2D9D5D8E4E3 DBD2732C201D1A1D71528488A4899DB8A3AFA19FA2ABB4BD C1C7D6ECF5F7F8F7F8F7F7F6F4F4F5F7F5F6F6EFEBECE6C2 B8CAD7E3E7D6CFB3B3C2D5D8E1DDE0E1 E7C43D2A2522211D4C366F718C8395A08A9D8C9AA3ACB2B9 C0C6D3E7EFF6F8F8F8F6F6F3E9EBF2F0F0F2F0EBE7E7C9AF B4D5E3E6EAEBEACB99B4BBCDE3E2E2D1 E5A8284A222224214D3187488B8182A9A2928D82919E9BAE B5B7C7DBE2EDF8F8F8F5F3F0E4E9EAE7DCE8EBE5E8CCB5B0 B2C2DADBE2EADEA38D97ABD0D9D5CB7F E17A262B312D27253E455E5D7D4F4B839E8C947C8B716A81 87888DB8D1EAF7F5F6F3F1EDE4E1DBD8CEDDE2E9D0B8B2AF ABA7B6CFDBDCA195918C92A4B59F7A64 7250242F3535241C265449466A413F81A08B727473657180 7F7DA4DDD2DCC5C9CCCFCAE4E0D6CBDCD1E2E3C6B9B5B0AF ADA8A9B3CBAF9D9A938B89877F766C64 263C1D171E3E2122353A343A994B2E6A837F4D5D53505F6A 6065A5ECEFBF9BC59FBD7EB0E0DACCD5C9DEE1BAB7B6B2AE AAA7A6A3A09B959087837F78726E685F 2F4D211C1B21222332423336968267724880545F68665159 5A679FEDE8CE809C9FBD858FE5E1D5D3C3DEDFB8B7B4B1AC A8A4A2A09D99958D89837F77716E6761 36401D1C224380A5B0B5B47A928C73645C804B4349464E71 80918FDDE9DB82A59CD8D68FD2DBDAD6C2E1E2B5B3B1AFAA A7A3A09D9B96928D8A88837C77746D65 2F421F281D9CA699F4FBECAEAF867B71676F5D5B47515092 989C97A9F2F3AADAEAF0E690DBD8C8B8B9DFE2B1B2B1ADAB A8A4A19C9995918D8A88878179757269 4A61533A28A4795FF4FCEB696237676B68614A47394A5476 7D777B90C6F2B4DAEBF0EC6C95ACB9ACC5BFC0B2B1B0AEAC ABA6A49E97948F888680807E77736D66 726E301D1F8D91D7ECD865254A2A774F5A5A3E3942414993 C2C4CEC8A7E29FD8ECEFE9A58D81706F646D81B6B2AFAEAA A8A4A29C98958F8C877E7F7C76706962 3E5320171E3C2F49373023253B28364B52554C514F444A5F B1BCCCC0AAA7A1CFEBF0E8DAE3DFD8CCBFB18BB8B5B2AFAD A9A7A49F9D9A928E88837C78746C6662 4E4E2B20192927282327456242495683586D54999C88918C 79AEC7BBB6ABAECDE4F0E8DCD2CBC5CDC5B3B4B8B7B5B3B0 AEAAA6A29F9B938F8D847F79716C6665 636E373A285553271B2D4849535B717193816CAEAFA3B6B4 A883BAC5C6C0C7DFEDF3E4DEDDD4CBC6B98DDCBABBB9B7B5 B3AFADA6A29A97928D86837A746E6864 6E7B3956314661231C2B3D1B42535F7BAA9469A7ABB0AFB0 B1A290BDC3C2C9DFECF4E6DFDDD5CEBC8DD6E7BBB9B9B8B7 B5B2B0AAA7A29B98938D8A817C76716C 7D7D394B3441241415211A1B3B325A626E716BA9ABAEACAC B1B49C9CC0C2C9DFECF4E8DFD9D0C188A8E6E5B7B7B5B5B4 B1B1AFACA7A49E9B99938F88847E7874 757935181D181513151F191937344F47524C6CA8A5A9AAAC AFB2B691ADC0C8DEEBF2E6DBD6C88E95B48CE5B3B1B0AEAE ACACA7A5A2A39F9B96938D8885817A75 757A3E241F605816161C181641345578687876A6A2A5A4A8 ACADAFB39EC1C9DEEDF2E5DCD1958497BE9CE8B3B0AEADAD ADAAA5A1A09B9896938D89857D797573 7C804E512A857E19172218193B546E81759F7BA29DA1A2A7 A8ADB0B1B4BEC8DFEBF2CD9598BC8B9AC2ECE6B1AEADADAD ACABA7A49F999690908D86827C7A7572 8A8D54622E796D1D141C15184456657899A1779E9CA0A2A5 AAAEB1B4B5BEC7DEECF2B04184E28D9DC7EDE5ADABACABAA A8A8A8A39F9A96908E898582817F7C78 8C8C55633B434D1A13171618362B5F618099809F9C9FA3A7 A9AEAFB0B2BEC7DEEEF3B840A9E88FA2CAEEE6ACACA9A8A6 A7A6A5A39F9D97958F8B8682807D7F7C 9192553F261C161717151519312C5F46413E57A39FA1A3A6 A9ACADADB1BCC6DEEEF3BB3EBAE790A8CFEFE7ADABA9AAA9 A7A6A4A09D9D9A9995908C8B83808280 9394561B23382E1918191C2B3234532B292A45A7A0A2A4A7 A9AAAFB0B3BFC9DFEEF4C141CCE791ABD3F1E8ADACA9AAA9 A8A5A5A19D9A97959591908E8A898682 8F94655027818C1F1719182C322F4545353F45A4A5A4A6A8 ABAEB0B1B4C0C8E1EEF3C646DFE78FA1CAECE6ADABAAA9A9 A9A4A39E9C99969291918F8C8C8A8986 9693676F2D9B971E1717191D4B3A85668F6D356691A8A9AD AEB2B3B3B6BECAE2EEF3C854EBE792B0D5EFE7B0ACABAAAA A8A5A59F9E9C9996918E8D8B8C8C8B8A 9C9B666E3E586F261618181C572F317A764D327585A9ACAF B1B4B2B5B8BEC7E3F0F1CC67EEE794B0D5F0E8B3AEAEAEAE ABA8A8A5A3A29D98959494908E8E8D8C A09F5B4531201B1815161818262C28303A2B359C96A8ADB1 B2B2B3B5B7BFCAE3F0F4D373ECE590AED5F0E7B3B0B0B3B1 AEABABA7A3A5A29D9B9A979392918F8D A29B2F1C1B191A1E1B273B49473C2C426884905BA3ABB0B3 B1B1B3B5B6BFC8E3F0F5D898EEE38EAFD5F2E9B4B1B0B2B2 AFADAAA9A7A5A2A09C9A9A9997969393 9C963F2B1B19181C1A3F6287626FA49D7642287EB2A9AEAD AEADB2B1B0B9C5E1F1F4DBB9ECE68CB2D7F1E8B4AFB0B0B1 AEABAAA8A5A39F9D9B98969596979394 987D4E6C321E192A2FA58FC4B69C7A7E7F55299DB4A9A7A9 A9ACAEAFA6AABFE2F1F3DFC9ECE989AED3F1E8B1AFADADAD ABA9A8A7A3A09D9B9A98969594929192 956A508D46191F2B8778AADB7A33508F867A29ADA9A8A7A4 A4A6A7A9A28089DFF0F2E1CBECE57FA4D0F1E6ADAAA8A8A8 A7A5A3A4A09F9B9898969290908F8D8C 93946D863E1A193AAC6AABE2933A374B436A26A5A2A19FA0 A2A3A4A59A7196E2DCF1B7CAEBE47698C2ECE4A8A6A6A5A5 A1A0A1A09D9B97959392928F8D8C8987 91916B3B1D18142598A8DD8D40282C1D1F1F28A09F9D9D9F 9E9FA1A2966A4B8AAFD844C9EAE3719BC7F0E3A4A3A5A5A3 A19F9E9D9B989693918F8E8D8A898686 90927D56473A1B172C3D3C1A232D3849757F7D9D9C9B9B9B 9A9D9C9D8C5B54A3E5C135C6EBE46D94C2EEE1A1A0A1A1A1 A09E9C9A96979392908E8E8F8B888989 8D8E8E8F8F935D22121415141C3D43A5A6A19F9C9B999897 95979A9A8C625171D68831B3E4D4507EB7ECDF9C9C9D9D9E 9B9C9A95939493908F8C8E90908E8A8A 8A8C8D8E8E91923B1F242424275D80A2A19C989592908F89 898C8E92845E512CB5412FB6DBD54D82BAEADF9896959698 989793918F90918C8C8B8B898C8D8A89 878B8C8D8E8D91642826272E3043949793928D8A88888481 7F7F8283784E4724232844BFDDD64987BAEFDC9190909191 908E8A8A898A88878585848184848280 8B8987868584877E2821222C2953918E898784817D7E7B7A 7A7776767746372A353372A5D0D94779B4EDDB8986878C89 8885838281817D7A7B7A7B7C7C7B7978 8783807C7877797C5321221D25718583817E7A7672747170 6F70717376553033373E7BA8D0E1695CA6E7C5817F848380 7F7A7879787975716E6F7371706F7072 84827B75757372716B471A1F507674757472706E696C6A6B 66676F7173662657404784B5E2E79D7F97EA976F6E707372 75736F6F6F716D6B6A6B676361626466 7F7B767171716D6C6C6E263F736F696A6868676565676868 6765686B71733C643D468EB1E5EBC29F8EE0686160606668 6A6B69696B6B6A6A6764605B58585657 7674716E6D6B6B686A6B75C16E6B686463605F605E606362 636161646A716E603A4491B4E6E9DFBA8CB457555657575B 5E606163686966635E5D5A5854524F50 6F6D6E6A68656664666A72D06B696867646262605C5C5E5D 5C5E5D6166696E5C353F90ABE5E9EBC66F77565553535353 54575A5C62646361595654504E4B4845 6B696A6564615E5F61656DD366656261616064635E5B5B5B 59595B5A5A5C645D31388CA4E2E9EAB4585754535352514F 4E50525253595C58534F4C4A4A484640 6663625D5B5A5B5A5B5F66D6615C5C5B5B5C60625D5C595B 5A58575757575A5C2F3383A0DFE6EB9452504F4F4F4E4E4A 4B4A4F4E4A4E504D49494A494745423E 5F5B5B565452545154575DD65A5754575A58595C5A595759 595657585654575B392E7999DEE5EA694E4B494947484846 4847494C4A4B4E483E3F3E3E3C3E3F3C 575454514E4C4C4D505162D8575655555654565655535456 575656585857595947266899DFE3CA4E4B48444342444241 4242454A4946453F3939393837353639 4F4C4C4B4949474C4B4E57DD5654525254504F4F4E4C5051 53535355555554544F264F94DBE1884745423F3F41403E3D 3E3E4242423E3C393536353434333334 4847464643434248464956D6504E4B4A4A49484946464A4A 4A4A4D4F4F51504F4E3C3A92E2D04D423F3D3C3C3B3B3B3A 3C3C3B3C3B383734333232323332302E 4141414040413E3D3F434DDF4C464343424140403E3E4042 45444749494C4D4B4A4A3581E17342403E3C3B3B39393838 3939373736363333323131303131302E 3D3E3D3C3D3C393B3B3D4BE149413E3B3A3A3B3A3A3A3B3B 3C3E3F4144464849484745608E46403F3D3D3B3A39373737 3837363635333231312F302E2F2F2E2D 3B3C3A3A39393939393943DE463938373534353537363737 3838393B3C3D40434342434B43403F3D3C3B393A38363636 35373634333130302E2E2D2C2D2D2C2A pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.522676 0.0113379 0.97619 0.464853 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage E1CDDDC9DCF3D2F2F67553878AC39EABA8AFB784739396A3 BFD4EEFCFDF9F8F9F9F0E5DDDEE7F4FDF5F6F8F9F7F4F0ED F5CDC6D3C7B4AA9E93BAC8C4CCCCC5CC E3CED8D5DAE8E4F0FD9F9CBCBBCEA39DA3A2AD897F9A9BAB C0D4EDFBFDF9F8F9F8F1E8E2E3EAF5FCF5F7F9F9F8F4EFEC F0C9BEC2AD99928A8EB0BBB8C5CACAD5 DAD3D6E8DBDDEBBCB5829BA3B0A78C76A1939D89879B99B0 C2D4EBFAFDFAF9F9F7F3EEEAEBF0F6FBF5F7F9FAF8F3EDE9 EFCDC1BCA090949397B1B4B2C0C6C7D4 CEDEDBEED8DEE262725C7D79A8A1A78FAB8F9284859492B0 C5D4E9F8FDFBF9F9F6F5F3F2F3F5F8FAF6F8FAFAF6EFE8E3 E3C8C1B99E97A8AEADBEBCBAC7C5BEC9 D4EBDCDBD0EAD82B504E6068AFAEC1ABBD9C9984829292B2 C7D4E6F5FCFDFAF9F6F6F7F7F8F9FAFAF7F9FBF9F3E9DFD9 CDB9B5AD9596ADB4BBC7C4C7D6CDBEC5 E6EEDAC9CFEFC02A4D5C5574B5AFB6A6C2ABAA8B84999CB7 CAD4E4F3FCFEFBF8F7F7F8F9F9FAFBFBF9FAFBF7EFE1D4CC C3B4B2AA959AAEAFBBC1BFCAE0D8C8D0 EFDEDED4E2DF8430718B6497BDB6B6BDACAAB38F86A2A5B7 CCD4E3F2FCFFFCF8F8F8F7F7F8FAFBFCFAFBFBF5EADACAC0 BEB1B2AE9EA6B4ADB9B9B2C2DEDACDD9 ECCBE6EEFACA46257593538FA1A1A7C9909FB38D84A6A8B2 CDD4E2F1FCFFFCF8F8F8F7F6F7F9FBFCFBFCFAF4E7D5C4B9 AFA4A9A99FABB7ABBDB7AAB8D5D4CBDA D9FFD0EEFACD5D233F4D4D7ECDB1D5C7ADA59B94949CA7AF CBD8E9F4F8FBFEFFFBFAF8F7F7F7F8F9FBFCFAF5E9D9C8BD B5B4ADA6AAB5B6AFC2C4C7CACDD1D6D9 E8DCCBFFBF632A1F336A8A95A26AA9CDB1AAA19B9CA5B0B8 C3D0E1EEF2F4F5F7FBFAF8F7F7F8F9FAFAFCFBF3E6DAD4D2 D0BBADAEACA5ACBBC5CAD0D3D6DAE1E7 F3D9DDFF791F20274A667A829F739DB5B6AFA6A0A1A8B2B9 BECBDFEFF7F9FAFAFAF9F8F7F7F9FAFBFAFBF9F1E6E0E1E5 DEC5BECCC3A7A8C1C5CCD5D9D9DCE3E9 DBECCBAF381E2C206C5A5969AF9CA29EB4AEA5A0A0A7B0B6 B9C7DBEEFAFEFEFDF9F8F7F6F6F7F9FAFBF8F4F0EDE9E3DF C6C6D4E4DBBFB0B3BDC7D3D9DADADEE2 C6E37A3D1825190F675F7572A08C95ACA7A39E9DA1AAB5BC BCC6D6E8F4F8F6F3F9F8F6F4F3F4F4F5FAF2EDF0F4ECD8C7 AFCBE1E2E0DCC9B0B1BCCCDBE3E4E2E0 E5C9361E2D2C0C1F4F4C776C94858EB7989695979EAAB5BD C5CBD6E5F2F7F6F2F9F8F5F1EFEEEEEEEEEAE9EEEFE2C7B1 BAD9E7DEE4F5E5C2A3ACBFD7E8EADDD0 F8A42437362D202D4434625788827B9F94918D8B8E949CA1 B1B5C1D3E7F5F9F9FAF7F3EFEBE8E6E6DCE2E9E9DFCCB9AC BECCD7DDE9EDD7B79599A8C2D5D0B499 DC791F3E1421321A413B73576D595284979188807B7A7C7E 868B9AB3D0E8F4F7FAF7F2EDE8E4E2E1CDDDEBE6CFBAB1B1 A7A7B7D6E3CFA88D8B8A93A9B9AB815B 5C5F2C2A2A47221A3D4E463E7B383589A2947365706E6E84 8A6D95E1D2D4B8E3C0D2C1EDE4BEDCE9E3E6E1CFBBB0ADAE A9ABB0B5B6AFA399938E88827E766D66 393D121815322237243A3E428F553A657C79645B635A566A 6B71A9F7E8CF91B7BFB78DA5DFC8D0BCBBCACDBCAEAFB4B3 A4A4A6A8A8A2988F8B86807B766F665F 2A3D2229172511292A3C39368E745F6E5E655C575A4C485F 3F6298E5EECF78A091AC9C8CEFDAEBE4D4EBEAC9B0B1B0A6 A4A19F9E9D98908988837D78746D645E 344D211317617DA1B5C3AE7CA888726C5E686057574C5272 8B9FA5D6F3DE7DA2A9D9D48BEEC8CFCCBCD9DDBDAAB4B5A8 ABA6A19D9B96908B8C87817D79736A63 174B2B182C8F9C99F3FFF4A4A47C7169686D5D4E4C495C86 96957FAAE3F7A6C8E6F8E07DEADACEBFC7DDDDC1B0B4B0A0 AFA9A29D9A96908C8D88837F7B756D67 3B6D4B3240958A70F8F2CC695A496A776566503E3F415783 837E729BCCF7C1DCE9F5E275ABAEACB8BCC2C2B9B4B4AEA3 ABA69F9B99958E8987837E7A77726A63 7E7F361A2986A6C2EBC79338302A525C5A5C4A3E42414F73 C9C7C7CFB9D1ADC6E7F3F4947E7E6D8377707A95ADB5B7BA A8A4A09E9C97908A84807B7775706862 434419201D3A2F4A4029260E35384D3D55594D484F494D68 ACB6CFCC8FA9A8CFEDE6F8DBDEFFCEC1BDA39EB6C3B5A7A8 A9A6A4A3A29C948D85817C7976716A64 595021361527311D0C384E4B4640547E5660539E998E868D 7DA4C9CBB3A6B5CCE0F2E3EFD0B5D9BFCCA6C0ACC5B1ABB5 B0AEAAA59E97908D8A87827B746D6865 52693D3B1E4F572415344144505565859C926DAAA8AAABB4 9599B0C9C6B6C4E3EAFAE1E2D5CFE4B9A9A6CFA9B9B7B9BA B1B0ADA8A29C96938B88837C756F6A67 6E7B4C4C2F5658261C2B2A314B586177A99A6DA8ACB6B8BE B49596BDCDC0CAEBEFFDE1D7DADEDCABA7C2F5B8B6B8BDB5 B1B0AEABA6A19C99918E89837C76716F 8F6F334E2B2A26131B23191A3441485B6C735EA4AAB1ACAB C2A194A8BABCC7DCEAF6E7DEDDCCB39BABC5FAC0BBB4B6B2 AEADACAAA6A29E9B9795908B847E7A78 86662234141F1D011721171428344059496564ACAAACA8A9 B8B3A69BA3BBCCD1E5F1F1E6DBB08696A0A4D7B5BCAEB0B9 A9A9A8A6A39F9B9995938F89837E7A78 7081402A165B5C1013221E1D334254725E7B72AB9EA3A8AE A9B9B6A0A1C0D8D9E8F1EBCBC9AA7799B8AED6B3BBA9A9B3 A6A6A5A39F9B97958D8B87827D787472 73965B3E3186822113201C223F53647F809278A3959EA3A6 A8B2B5AFAFBFD3E0ECF1CD86A4BE8997D3D5F4B3B0AAABA7 A8A7A5A39F9A96938C8A86817C787472 818D555142796B1A131B141D41576377929D7BA49BA5A39C AFA9AEBABAB6C4DDEDEEAD4682D39E92C4DEFEA59EAEB8A8 AAA9A7A49F9A9593908E8B86817D7977 9486545F39524C1117160E0A332E6153749883A394AAAFA4 AFACAEB3B4B8CADFEBFFB44AA6E78BA8CBF1E2B0A3ACAAA9 A8A7A5A29F9C9A998C8B8985827F7C7B 91914E512A20191B151818193F315B494F534CA29F929AB8 AFACAEB3B4B9CBDFEDFFB846B4E690A7CCF1E2B1A4ACABAA A7A6A4A19E9B9998908E8C898683817F 8AA14F382232271E16191B1B391F3F2B182233ACBAA39AB2 B0ADAFB4B5B9CBE0F1F5BE43CBE497A6CDF2E4B2A5ADACAB A6A5A3A09D9A98979392908D8A888684 89A560382A87831718191B1F3F254D413A4B4295A8B6AB9F B1AEAFB4B6BACCE1F3EDC548E1E39BA6CFF4E5B4A7AFAEAC A7A6A3A19D9B99979493918F8D8A8887 96937464319CAE1A19171A264E3F767988753A6B7EA3ACA6 B2AFB0B5B6BBCDE1F3EBCA57EEE499A9D0F6E7B5A8B1AFAE A8A7A5A29F9C9A999493918F8D8B8A89 A58472832B5374231813141D3E265B616D4E22768F9DA4B4 B2AFB1B6B7BCCEE2F0F0CD6EF0E890AED2F7E8B7AAB2B1B0 ABAAA8A5A29F9D9C94949391908E8D8C A49253572120292219161B24380C302F3A473E92A1ADAEB3 B3B0B2B7B8BCCEE3EDF8CD87ECEB86B4D3F8EAB8ABB3B2B1 AEADABA8A5A2A09F9897979594939291 98AE330F1D290C171B1F314459254039578E79887DAEC1AE B3B0B2B7B8BDCFE3EAFDCD96E7EE7EB7D4F9EAB9ACB4B3B1 B0AFADAAA7A4A2A19B9B9A9998979696 9A934548032D0B1B0E55516F846C90AC6E471584CA9FBAA1 A6B0ABA9B6B9C8EBFCE2DEC9E3D0A4A7DEF6E2BBB3B3AEB0 ACABAAA8A5A3A2A19797979796969696 9E86455E1C290D363A99B3BBA5828D7F8B66258DB69DB3AB AFB4ACA9A89CACDAF6EAEDD6E7ED93B5D9F2E0B7AEAFAAAC A8A8A6A4A29F9E9D9797969594939292 9279598D4C2E093C707FA5D59940557C8B7939A3A8A1A1A6 A7A9A7ABA38AA1E4F2FEE4DDE1F76EA7D2EFDDB1A7AAA6A7 A4A3A2A09D9B9A9997969492908F8D8C 937D618043210532AD8AADD785263969455230AB9FAC96A3 9E9DA0A999738BD8D7FEA0D1DCF06596CCEEDEAEA1A7A5A4 A2A1A09E9B999897959492908D8B8988 9F8D5F4917140F268D9DC09B4E3A300E1C3630A295B196AB A2A09EA28A5862A6BDE64DC5E6EC7E97C7EFE0AC9DA6A5A2 A2A19F9D9B9997969493918E8C898786 90957D5D43442C123539502B112D32346B736AA793A790A7 9D9F9EA190625C89CFC632C3ECE4778AC1EEE1A898A3A39F A09F9D9B999795949291908E8C8A8888 8290948C8F87581E1D020C061B3F5BB1B5A8A0A7979A899A 8F97969A96715B6DDB813CBAE0E04D7FBAEBDEA3919EA09A 9B9A99979492919090908F8E8D8C8B8B 938A83819A9B7D4E162F3E0F2A6367A3A4929C9497948C97 8A938D8A86623C38BF2C3DA7D1EA348DB5E7DC9E8B9A9C96 97979593918E8D8C8F8F8F8E8E8E8D8D 86898E93948D8076281F282F1E48A48E93908C888481807F 8D6C7D926F504128281B58B0DBDA5383BFE4E8997A9E9989 918E8A898A8985818484848483838382 8987858687847E7824292A342B4D978F8B8985817E7D7C7C 836E76856F4D3729362F67AED2D2516EB0EBD49181919384 8985828182827E7B7D7D7C7C7B7B7A7A 8A837C78797B7B7A403A13263B6088837E7C7A7775757575 74726D72714F30333D4178ACCDD366689FF3B480857A877A 7D7A777778787572727271706F6F6E6E 867F7672737576756E51001E4D777A70716F6E6C6C6C6D6E 66746666775A3948384783ADD3E3977E95F391697E607670 726F6D6D70716E6B6968676665646362 7D7974727373706D786C2354647A6A6A6766656463646667 5F7063637A684F5F36498BB2DFF0C99C8FDF75536D4C6566 6A6765676A6C6A676261605E5D5B5A59 75737070716F6A655C7B6BAD766A5D706362605F5E5F6061 5D656265736F64683C498EB6E6EEE5AD82B265475B49585C 615F5E60656766635B5B595755535151 716D696868686460537684D975635D6E62615F5D5C5C5D5D 5F585F65626A6E613C4187B5E6E2F0B36D7B5D4752535154 595756595E61615E555452504D4B4948 6F69625F6061615F656A6ED16B68646363625F5D5B5B5B5B 614E5D655462705736347DB2E4D9F5B75C555B4A4F5E4E50 545251545A5D5D5B504F4D4A48454342 666563605E5B59585C5F69E0535B58595A5A5A5A5A5A5A5A 59595958585757572F3B80A2E0F0E7964E4E4E4D4C4B4B4B 4A4B4D4E4E4E4D4C4646464544434343 5F5E5C5A57555352585B66DF535A56595959595959595959 5858585857575757382E799ED1F0E9704B4B4B4A49484848 47484A4B4B4A49484141403F3F3E3D3D 555553514F4D4B4A515360DE535753575555555555555555 565656565656565645256897D1EBD2464746464544444343 43434546454443423A3A393938373736 4E4D4C4A494746454A4A5ADD53534D545050505050505050 51515252535354544C2E518DEEDA9737414141403F3E3E3E 3E3E3F403F3E3C3B3636353434333232 4948474645444342444354DD524D454E4848484848484848 4B4B4C4D4E4F50504D41407FFFB751423D3D3C3C3B3A3A39 3A3A3B3B3A3836353534343332323131 4444434241414040413D50DC52473D474040404040404040 44454647484A4B4B4B483E6EE6852D4C3B3B3A3939383737 3838383837343230333332323130302F 3E3E3E3D3D3C3C3C3F394DDC514235403939393939393939 3E3F404143454647493B4A5E915238433A39393837373636 373737373532302E30302F2F2E2D2D2C 3A3A3A39393939383F384CDC503E313D3535353535353535 3A3B3C3E404243444A2B5754463151353A39393837373636 3737373634312F2D2D2D2D2C2B2A2A2A pop P % End of image MathSubEnd P % End of sub-graphic P P % End of Graphics MathPictureEnd :[font = text; inactive; preserveAspect; endGroup] Note that some artifacts are visible, particularly around high-contrast edges. In the next section, we will compare the visual effects and the amount of compression obtained from different degrees of quantization. :[font = section; inactive; preserveAspect; startGroup] Entropy :[font = text; inactive; preserveAspect] To measure how much compression is obtained from a quantization matrix, we use a famous theorem of Claude Shannon [Shannon and Weaver 1949]. The theorem states that for a sequence of symbols with no correlations beyond first order, no code can be devised to represent the sequence that uses fewer bits per symbol than the first-order entropy, which is given by ;[s] 3:0,0;322,1;341,0;366,-1; 2:2,13,9,Times,0,12,0,0,0;1,13,9,Times,2,12,0,0,0; :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 0; pictureWidth = 93; pictureHeight = 33] %! %%Creator: Mathematica MathPictureStart % Start of picture % Scaling calculations 0 1 0 1 [ [ 0.000000 0.000000 0 0 ] [ 1.000000 0.354839 0 0 ] ] MathScale % Start of Graphics 0 setgray 0 setlinewidth 0.000000 setlinewidth 1.000000 0.000000 moveto 1.000000 0.000000 lineto stroke 0.000000 0.354839 moveto 0.000000 0.354839 lineto stroke /Times findfont 12 scalefont setfont [(h)] 0.010753 0.107527 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(=)] 0.107527 0.096774 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(-)] 0.215054 0.096774 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(p)] 0.462366 0.107527 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(i)] 0.516129 0.086022 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(log)] 0.569893 0.107527 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(2)] 0.741936 0.086022 -1 -1 Mshowa /Times findfont 12 scalefont setfont [(p)] 0.849462 0.107527 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(i)] 0.903226 0.086022 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\()] 0.784946 0.096774 -1 -1 Mshowa /Symbol findfont 12 scalefont setfont [(\))] 0.946237 0.096774 -1 -1 Mshowa /Times findfont 7 scalefont setfont [(i)] 0.354839 0.000000 -1 -1 Mshowa /Symbol findfont 18 scalefont setfont [(e)] 0.290323 0.064516 -1 -1 Mshowa %% End of Graphics MathPictureEnd %% End of picture :[font = text; inactive; preserveAspect] where pi is the relative frequency of the ith symbol. ;[s] 7:0,0;6,1;7,2;8,1;10,0;43,1;44,0;55,-1; 3:3,13,9,Times,0,12,0,0,0;3,13,9,Times,2,12,0,0,0;1,21,13,Times,66,12,0,0,0; :[font = text; inactive; preserveAspect] To compute the first-order entropy of a list of numbers, we use the function Frequencies, from the standard package Statistics`DataManipulation`. This function computes the relative frequencies of elements in a list: ;[s] 5:0,0;77,1;88,0;116,1;144,0;217,-1; 2:3,13,9,Times,0,12,0,0,0;2,13,10,Courier,1,12,0,0,0; :[font = input; initialization; preserveAspect] *) Frequencies[list_List] := Map[{Count[list, #], #}&, Union[list]] (* :[font = input; preserveAspect; startGroup] Characters["mississippi"] :[font = output; output; inactive; preserveAspect; endGroup] {"m", "i", "s", "s", "i", "s", "s", "i", "p", "p", "i"} ;[o] {m, i, s, s, i, s, s, i, p, p, i} :[font = input; preserveAspect; startGroup] Frequencies[%] :[font = output; output; inactive; preserveAspect; endGroup] {{4, "i"}, {1, "m"}, {2, "p"}, {4, "s"}} ;[o] {{4, i}, {1, m}, {2, p}, {4, s}} :[font = text; inactive; preserveAspect] Calculating the first-order entropy is straightforward: :[font = input; preserveAspect] Entropy[list_] := - Plus @@ N[# Log[2, #]]& @ (First[Transpose[Frequencies[list]]]/Length[list]) :[font = text; inactive; preserveAspect] For example, the entropy of a list of four distinct symbols is 2, so 2 bits are required to code each symbol: :[font = input; preserveAspect; startGroup] Entropy[{"a", "b", "c", "d"}] :[font = output; output; inactive; preserveAspect; endGroup] 2. ;[o] 2. :[font = text; inactive; preserveAspect] Similarly, 1.82307 bits are required for this longer list with four symbols: :[font = input; preserveAspect; startGroup] Entropy[Characters["mississippi"]] :[font = output; output; inactive; preserveAspect; endGroup] 1.823067982273661 ;[o] 1.82307 :[font = text; inactive; preserveAspect] A list with more symbols and fewer repetitions requires more bits per symbol: :[font = input; preserveAspect; startGroup] Entropy[Characters["california"]] :[font = output; output; inactive; preserveAspect; endGroup] 2.921928094887362 ;[o] 2.92193 :[font = text; inactive; preserveAspect] The appearance of fractional bits may be puzzling to some readers, since we think of a bit as a minimal, indivisible unit of information. Fractional bits are a natural outcome of the use of what are called "variable word-length" codes. Consider an image containing 63 pixels with a greylevel of 255, and one pixel with a graylevel of 0. If we employed a code which used a symbol of length 1 bit to represent 255, and a symbol of length 2 bits to represent 0, then we would need 65 bits to represent the image, or in terms of the average bit-rate, 65/64 = 1.0156 bits/pixel. The entropy as calculated above is a lower bound on this average bit-rate. The compression ratio is another frequently used measure of how effectively an image has been compressed. It is simply the ratio of the size of the image file before and after compression. It is equal to the ratio of bit-rates, in bits/pixel, before and after compression. Since the initial bit-rate is usually 8 bits/pixel, and the entropy is our estimate of the compressed bit-rate, the compression ratio is estimated by 8/entropy. ;[s] 6:0,0;529,2;536,0;655,2;672,0;1084,1;1085,-1; 3:3,13,9,Times,0,12,0,0,0;1,13,9,Times,0,12,65535,0,0;2,13,9,Times,2,12,0,0,0; :[font = text; inactive; preserveAspect] We will use the following function to examine the effects of quantization: :[font = input; preserveAspect] f[image_, qMatrix_] := {Entropy[Flatten[#]], IDCT[IDCTQ[#, qMatrix]]}& @ DCTQ[DCT[image], qMatrix] :[font = text; inactive; preserveAspect] This function transforms and quantizes an image, computes the entropy, and dequantizes and reconstructs the image. It returns the entropy and the resulting image. A simple way to experiment with different degrees of quantization is to divide the "de facto" matrix qLum by a scalar and look at the results for various values of this parameter: ;[s] 3:0,0;264,1;268,0;343,-1; 2:2,16,11,Times,0,12,0,0,0;1,16,11,Courier,1,12,0,0,0; :[font = input; preserveAspect] test = f[shuttle, qLum/#]& /@ {1/4, 1/2, 1, 4}; :[font = text; inactive; preserveAspect] Here are the reconstructed images and the corresponding entropies: :[font = input; preserveAspect; startGroup] Show[GraphicsArray[ Partition[ Apply[ ShowImage[#2, {0, 255}, PlotLabel -> #1, DisplayFunction -> Identity]&, test, 1], 2] ] ] :[font = postscript; PostScript; formatAsPostScript; output; inactive; preserveAspect; pictureLeft = 32; pictureWidth = 236; pictureHeight = 236] %! %%Creator: Mathematica %%AspectRatio: 1 MathPictureStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.47619 0.0238095 0.47619 [ [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash 0 g p P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath p p % Start of sub-graphic p 0.0238095 0.0238095 0.477324 0.477324 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [(1.7534)] .5 1 0 -2 Msboxa [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p [(1.7534)] .5 1 0 -2 Mshowa P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage E1CDDDC9DCF3D2F2F67553878AC39EABA8AFB784739396A3 BFD4EEFCFDF9F8F9F9F0E5DDDEE7F4FDF5F6F8F9F7F4F0ED F5CDC6D3C7B4AA9E93BAC8C4CCCCC5CC E3CED8D5DAE8E4F0FD9F9CBCBBCEA39DA3A2AD897F9A9BAB C0D4EDFBFDF9F8F9F8F1E8E2E3EAF5FCF5F7F9F9F8F4EFEC F0C9BEC2AD99928A8EB0BBB8C5CACAD5 DAD3D6E8DBDDEBBCB5829BA3B0A78C76A1939D89879B99B0 C2D4EBFAFDFAF9F9F7F3EEEAEBF0F6FBF5F7F9FAF8F3EDE9 EFCDC1BCA090949397B1B4B2C0C6C7D4 CEDEDBEED8DEE262725C7D79A8A1A78FAB8F9284859492B0 C5D4E9F8FDFBF9F9F6F5F3F2F3F5F8FAF6F8FAFAF6EFE8E3 E3C8C1B99E97A8AEADBEBCBAC7C5BEC9 D4EBDCDBD0EAD82B504E6068AFAEC1ABBD9C9984829292B2 C7D4E6F5FCFDFAF9F6F6F7F7F8F9FAFAF7F9FBF9F3E9DFD9 CDB9B5AD9596ADB4BBC7C4C7D6CDBEC5 E6EEDAC9CFEFC02A4D5C5574B5AFB6A6C2ABAA8B84999CB7 CAD4E4F3FCFEFBF8F7F7F8F9F9FAFBFBF9FAFBF7EFE1D4CC C3B4B2AA959AAEAFBBC1BFCAE0D8C8D0 EFDEDED4E2DF8430718B6497BDB6B6BDACAAB38F86A2A5B7 CCD4E3F2FCFFFCF8F8F8F7F7F8FAFBFCFAFBFBF5EADACAC0 BEB1B2AE9EA6B4ADB9B9B2C2DEDACDD9 ECCBE6EEFACA46257593538FA1A1A7C9909FB38D84A6A8B2 CDD4E2F1FCFFFCF8F8F8F7F6F7F9FBFCFBFCFAF4E7D5C4B9 AFA4A9A99FABB7ABBDB7AAB8D5D4CBDA D9FFD0EEFACD5D233F4D4D7ECDB1D5C7ADA59B94949CA7AF CBD8E9F4F8FBFEFFFBFAF8F7F7F7F8F9FBFCFAF5E9D9C8BD B5B4ADA6AAB5B6AFC2C4C7CACDD1D6D9 E8DCCBFFBF632A1F336A8A95A26AA9CDB1AAA19B9CA5B0B8 C3D0E1EEF2F4F5F7FBFAF8F7F7F8F9FAFAFCFBF3E6DAD4D2 D0BBADAEACA5ACBBC5CAD0D3D6DAE1E7 F3D9DDFF791F20274A667A829F739DB5B6AFA6A0A1A8B2B9 BECBDFEFF7F9FAFAFAF9F8F7F7F9FAFBFAFBF9F1E6E0E1E5 DEC5BECCC3A7A8C1C5CCD5D9D9DCE3E9 DBECCBAF381E2C206C5A5969AF9CA29EB4AEA5A0A0A7B0B6 B9C7DBEEFAFEFEFDF9F8F7F6F6F7F9FAFBF8F4F0EDE9E3DF C6C6D4E4DBBFB0B3BDC7D3D9DADADEE2 C6E37A3D1825190F675F7572A08C95ACA7A39E9DA1AAB5BC BCC6D6E8F4F8F6F3F9F8F6F4F3F4F4F5FAF2EDF0F4ECD8C7 AFCBE1E2E0DCC9B0B1BCCCDBE3E4E2E0 E5C9361E2D2C0C1F4F4C776C94858EB7989695979EAAB5BD C5CBD6E5F2F7F6F2F9F8F5F1EFEEEEEEEEEAE9EEEFE2C7B1 BAD9E7DEE4F5E5C2A3ACBFD7E8EADDD0 F8A42437362D202D4434625788827B9F94918D8B8E949CA1 B1B5C1D3E7F5F9F9FAF7F3EFEBE8E6E6DCE2E9E9DFCCB9AC BECCD7DDE9EDD7B79599A8C2D5D0B499 DC791F3E1421321A413B73576D595284979188807B7A7C7E 868B9AB3D0E8F4F7FAF7F2EDE8E4E2E1CDDDEBE6CFBAB1B1 A7A7B7D6E3CFA88D8B8A93A9B9AB815B 5C5F2C2A2A47221A3D4E463E7B383589A2947365706E6E84 8A6D95E1D2D4B8E3C0D2C1EDE4BEDCE9E3E6E1CFBBB0ADAE A9ABB0B5B6AFA399938E88827E766D66 393D121815322237243A3E428F553A657C79645B635A566A 6B71A9F7E8CF91B7BFB78DA5DFC8D0BCBBCACDBCAEAFB4B3 A4A4A6A8A8A2988F8B86807B766F665F 2A3D2229172511292A3C39368E745F6E5E655C575A4C485F 3F6298E5EECF78A091AC9C8CEFDAEBE4D4EBEAC9B0B1B0A6 A4A19F9E9D98908988837D78746D645E 344D211317617DA1B5C3AE7CA888726C5E686057574C5272 8B9FA5D6F3DE7DA2A9D9D48BEEC8CFCCBCD9DDBDAAB4B5A8 ABA6A19D9B96908B8C87817D79736A63 174B2B182C8F9C99F3FFF4A4A47C7169686D5D4E4C495C86 96957FAAE3F7A6C8E6F8E07DEADACEBFC7DDDDC1B0B4B0A0 AFA9A29D9A96908C8D88837F7B756D67 3B6D4B3240958A70F8F2CC695A496A776566503E3F415783 837E729BCCF7C1DCE9F5E275ABAEACB8BCC2C2B9B4B4AEA3 ABA69F9B99958E8987837E7A77726A63 7E7F361A2986A6C2EBC79338302A525C5A5C4A3E42414F73 C9C7C7CFB9D1ADC6E7F3F4947E7E6D8377707A95ADB5B7BA A8A4A09E9C97908A84807B7775706862 434419201D3A2F4A4029260E35384D3D55594D484F494D68 ACB6CFCC8FA9A8CFEDE6F8DBDEFFCEC1BDA39EB6C3B5A7A8 A9A6A4A3A29C948D85817C7976716A64 595021361527311D0C384E4B4640547E5660539E998E868D 7DA4C9CBB3A6B5CCE0F2E3EFD0B5D9BFCCA6C0ACC5B1ABB5 B0AEAAA59E97908D8A87827B746D6865 52693D3B1E4F572415344144505565859C926DAAA8AAABB4 9599B0C9C6B6C4E3EAFAE1E2D5CFE4B9A9A6CFA9B9B7B9BA B1B0ADA8A29C96938B88837C756F6A67 6E7B4C4C2F5658261C2B2A314B586177A99A6DA8ACB6B8BE B49596BDCDC0CAEBEFFDE1D7DADEDCABA7C2F5B8B6B8BDB5 B1B0AEABA6A19C99918E89837C76716F 8F6F334E2B2A26131B23191A3441485B6C735EA4AAB1ACAB C2A194A8BABCC7DCEAF6E7DEDDCCB39BABC5FAC0BBB4B6B2 AEADACAAA6A29E9B9795908B847E7A78 86662234141F1D011721171428344059496564ACAAACA8A9 B8B3A69BA3BBCCD1E5F1F1E6DBB08696A0A4D7B5BCAEB0B9 A9A9A8A6A39F9B9995938F89837E7A78 7081402A165B5C1013221E1D334254725E7B72AB9EA3A8AE A9B9B6A0A1C0D8D9E8F1EBCBC9AA7799B8AED6B3BBA9A9B3 A6A6A5A39F9B97958D8B87827D787472 73965B3E3186822113201C223F53647F809278A3959EA3A6 A8B2B5AFAFBFD3E0ECF1CD86A4BE8997D3D5F4B3B0AAABA7 A8A7A5A39F9A96938C8A86817C787472 818D555142796B1A131B141D41576377929D7BA49BA5A39C AFA9AEBABAB6C4DDEDEEAD4682D39E92C4DEFEA59EAEB8A8 AAA9A7A49F9A9593908E8B86817D7977 9486545F39524C1117160E0A332E6153749883A394AAAFA4 AFACAEB3B4B8CADFEBFFB44AA6E78BA8CBF1E2B0A3ACAAA9 A8A7A5A29F9C9A998C8B8985827F7C7B 91914E512A20191B151818193F315B494F534CA29F929AB8 AFACAEB3B4B9CBDFEDFFB846B4E690A7CCF1E2B1A4ACABAA A7A6A4A19E9B9998908E8C898683817F 8AA14F382232271E16191B1B391F3F2B182233ACBAA39AB2 B0ADAFB4B5B9CBE0F1F5BE43CBE497A6CDF2E4B2A5ADACAB A6A5A3A09D9A98979392908D8A888684 89A560382A87831718191B1F3F254D413A4B4295A8B6AB9F B1AEAFB4B6BACCE1F3EDC548E1E39BA6CFF4E5B4A7AFAEAC A7A6A3A19D9B99979493918F8D8A8887 96937464319CAE1A19171A264E3F767988753A6B7EA3ACA6 B2AFB0B5B6BBCDE1F3EBCA57EEE499A9D0F6E7B5A8B1AFAE A8A7A5A29F9C9A999493918F8D8B8A89 A58472832B5374231813141D3E265B616D4E22768F9DA4B4 B2AFB1B6B7BCCEE2F0F0CD6EF0E890AED2F7E8B7AAB2B1B0 ABAAA8A5A29F9D9C94949391908E8D8C A49253572120292219161B24380C302F3A473E92A1ADAEB3 B3B0B2B7B8BCCEE3EDF8CD87ECEB86B4D3F8EAB8ABB3B2B1 AEADABA8A5A2A09F9897979594939291 98AE330F1D290C171B1F314459254039578E79887DAEC1AE B3B0B2B7B8BDCFE3EAFDCD96E7EE7EB7D4F9EAB9ACB4B3B1 B0AFADAAA7A4A2A19B9B9A9998979696 9A934548032D0B1B0E55516F846C90AC6E471584CA9FBAA1 A6B0ABA9B6B9C8EBFCE2DEC9E3D0A4A7DEF6E2BBB3B3AEB0 ACABAAA8A5A3A2A19797979796969696 9E86455E1C290D363A99B3BBA5828D7F8B66258DB69DB3AB AFB4ACA9A89CACDAF6EAEDD6E7ED93B5D9F2E0B7AEAFAAAC A8A8A6A4A29F9E9D9797969594939292 9279598D4C2E093C707FA5D59940557C8B7939A3A8A1A1A6 A7A9A7ABA38AA1E4F2FEE4DDE1F76EA7D2EFDDB1A7AAA6A7 A4A3A2A09D9B9A9997969492908F8D8C 937D618043210532AD8AADD785263969455230AB9FAC96A3 9E9DA0A999738BD8D7FEA0D1DCF06596CCEEDEAEA1A7A5A4 A2A1A09E9B999897959492908D8B8988 9F8D5F4917140F268D9DC09B4E3A300E1C3630A295B196AB A2A09EA28A5862A6BDE64DC5E6EC7E97C7EFE0AC9DA6A5A2 A2A19F9D9B9997969493918E8C898786 90957D5D43442C123539502B112D32346B736AA793A790A7 9D9F9EA190625C89CFC632C3ECE4778AC1EEE1A898A3A39F A09F9D9B999795949291908E8C8A8888 8290948C8F87581E1D020C061B3F5BB1B5A8A0A7979A899A 8F97969A96715B6DDB813CBAE0E04D7FBAEBDEA3919EA09A 9B9A99979492919090908F8E8D8C8B8B 938A83819A9B7D4E162F3E0F2A6367A3A4929C9497948C97 8A938D8A86623C38BF2C3DA7D1EA348DB5E7DC9E8B9A9C96 97979593918E8D8C8F8F8F8E8E8E8D8D 86898E93948D8076281F282F1E48A48E93908C888481807F 8D6C7D926F504128281B58B0DBDA5383BFE4E8997A9E9989 918E8A898A8985818484848483838382 8987858687847E7824292A342B4D978F8B8985817E7D7C7C 836E76856F4D3729362F67AED2D2516EB0EBD49181919384 8985828182827E7B7D7D7C7C7B7B7A7A 8A837C78797B7B7A403A13263B6088837E7C7A7775757575 74726D72714F30333D4178ACCDD366689FF3B480857A877A 7D7A777778787572727271706F6F6E6E 867F7672737576756E51001E4D777A70716F6E6C6C6C6D6E 66746666775A3948384783ADD3E3977E95F391697E607670 726F6D6D70716E6B6968676665646362 7D7974727373706D786C2354647A6A6A6766656463646667 5F7063637A684F5F36498BB2DFF0C99C8FDF75536D4C6566 6A6765676A6C6A676261605E5D5B5A59 75737070716F6A655C7B6BAD766A5D706362605F5E5F6061 5D656265736F64683C498EB6E6EEE5AD82B265475B49585C 615F5E60656766635B5B595755535151 716D696868686460537684D975635D6E62615F5D5C5C5D5D 5F585F65626A6E613C4187B5E6E2F0B36D7B5D4752535154 595756595E61615E555452504D4B4948 6F69625F6061615F656A6ED16B68646363625F5D5B5B5B5B 614E5D655462705736347DB2E4D9F5B75C555B4A4F5E4E50 545251545A5D5D5B504F4D4A48454342 666563605E5B59585C5F69E0535B58595A5A5A5A5A5A5A5A 59595958585757572F3B80A2E0F0E7964E4E4E4D4C4B4B4B 4A4B4D4E4E4E4D4C4646464544434343 5F5E5C5A57555352585B66DF535A56595959595959595959 5858585857575757382E799ED1F0E9704B4B4B4A49484848 47484A4B4B4A49484141403F3F3E3D3D 555553514F4D4B4A515360DE535753575555555555555555 565656565656565645256897D1EBD2464746464544444343 43434546454443423A3A393938373736 4E4D4C4A494746454A4A5ADD53534D545050505050505050 51515252535354544C2E518DEEDA9737414141403F3E3E3E 3E3E3F403F3E3C3B3636353434333232 4948474645444342444354DD524D454E4848484848484848 4B4B4C4D4E4F50504D41407FFFB751423D3D3C3C3B3A3A39 3A3A3B3B3A3836353534343332323131 4444434241414040413D50DC52473D474040404040404040 44454647484A4B4B4B483E6EE6852D4C3B3B3A3939383737 3838383837343230333332323130302F 3E3E3E3D3D3C3C3C3F394DDC514235403939393939393939 3E3F404143454647493B4A5E915238433A39393837373636 373737373532302E30302F2F2E2D2D2C 3A3A3A39393939383F384CDC503E313D3535353535353535 3A3B3C3E404243444A2B5754463151353A39393837373636 3737373634312F2D2D2D2D2C2B2A2A2A pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.522676 0.0238095 0.97619 0.477324 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [(3.10061)] .5 1 0 -2 Msboxa [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p [(3.10061)] .5 1 0 -2 Mshowa P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage DDCED0D3D6E2E5E1E69F3F938CB6B6A1B1B7A6807E8A9BA4 BDD6F1FDFDFAFBFCFAF0DFD5DCEDF7F8F9FEFCF7F8F5EFEE EEDBB6E0BEB0C29F90B7C3CFDCC0C9D1 D9D9D7E0E7DFDDF2EB9B96C2B8BEAFA092ACAA7F8B9299AA BDD4EFFCFDFBFBFBFBF2E4DBE1EEF7F7F7FDFAF9FDF9F2F6 E8CFBFD1A38E998E9BAAA3B2C4C6CDD4 DED7D8E0DCE6EBB9D876A7A2A7BA93769596A47F8B909BAE BFD3EBFAFDFCFAF9FBF6EDE5E8F1F7F7F8FEF9F7FDF2E8F0 F2C7C4C3A29392929BB0ADAFB1C8CBCE E1D9DADAD4E6EA54586A776FA7B29094B4829B85878CA3AB C4D4E8F7FCFCFAF9F9F8F4EFEFF4F8F8FAFFF7F6FAE9DBE4 EBBFBBAFA49FA3A2A3B4C3C7BFC5C6D1 DDE9E3DADEDED427416C5777ADA2B3B0C38DA28A8C90A4AA CAD6E7F5FBFBFAFAF8F8F8F6F5F7F9FAF9FCF7F7F8E7D8DE D1C0BAA49A97AEB1C8B9C7D5D8C1BBCA E1E8E4D4D4E5CC2A5F544563BDAFA2C1BEB4B3838D939FB1 CCD6E5F3FAFAFAFAF7F8F9F8F8F9FAFAF9F9F9F9F2E2D3D0 BFC0B5A09998B5B7C3BEC6CFE2D0CAC7 E7DDDFD9CFE9982A89707E95C3B7AEBAA8BCB4838E96A0B4 CAD3E4F4FBFAF9FBF8F8F8F9F9F9F9FAFAF8FCF9E9DACCBE B4B3A79CA1A5B1B0A8B9B5C2DEE0E0D8 E3DDE0EEEADA3A25629A6185AC9AC9B48BA2A792959DA8AE C6D1E3F4FBFAF9FAF9F8F7F8F9F8F8F9F9F5FDFAE6D9CCB7 B3AFA9A3AAAFACB0C2BF9FBED7D1CDD6 EAE7E6ECECD64F2237524F79D4ABBFD0AE99A69194A3A6B4 C6D5DFEBFCFEF9FBF9F9F9F9F9F9FAFBF7FBFBF5EADCCBBE BBB6AAA5A4B8B4B4C9C0B7CCDFD8D7DD E4E3F0E7CE622B1F4B4B927AB08ABACACF99A0939D9CA0C5 C7D9E6F0FAF9F5F9F9F9FAF9F8F8F8F9F7F9F9F4E7DAD2CF C6B8B9ACA5B0A7B7C3D2D4D9DEDBE1E6 E7E0DBEB722920263F7E8E8391699BAFB896A796A4A9A8C0 BECEDEEEFAFCF9FCF9F9FAF9F8F7F7F7FAFAF9F4EAE1DFE1 DAC1D3CBC4B8A6BDBFD8D1CBD7D7DDEB DCE7D0C7352A1E236D5E3E4FB7ABA3A6B1B4B69A9BADB3B9 C4CDDBEDFCFEFAF7F9F9F8F7F6F6F7F9FAFAF8F2EFECE5DF D0BFD8DEDFC3ABB4C0C1D1E0D4D6E6DC DDD3773118181C1D71527A8CA48695BDA3B2A4A29FA9B4BB C2C7D7EAF5F8F7F5F9F8F6F4F3F4F6F9F5F7F4EEEFEEDDC6 B7C7DCE2E8D6CAB6AFC5D0DADEDCE2E6 E4C1352A2C2922184B307477898994A08C988A99A5ADB4BB BFC4D7E9EEF2F9FBF9F7F4F0EEEEF0F2EEF2F1EBEAE3CBB1 B0DAE7E5EAEFECC699B8BFCAE4EADED1 EBAD284A181F1D244D328A45868384A8A099908094979CA8 B8B7C7DCE5EEF8F9F8F6F2EDE9E6E5E6E0E6ECEADFCDBAAD ADC8D4DCE3EAD6B2928AAFD5D2DACA82 DF7C232A362D26233C445E5D804B5080A18897788B746A83 888192B4D1EAF8F7F7F5F2ECE5E0DDDBD0D8E4E6D3BAAFB2 ABA7B3D3DFD9A78D8C9191A4B5A07D5F 6D54252B3A2D251E254F4E4768413F839C907271716A6E85 8278A1E5CDDFC7C7CAD5BFEBE5D2CBDFD1E4E1C9BAB6B2AC AFA7AAB9BFB3A199948A88887F746C65 233A1B121F3F2617383C283B935030668B794E5D584F5A6A 5C66ADEAEEC498C9A2B88BADDADFD0D0CADFDDBBB3B5B2AF ACA3A1A6A69C928D89817E7C746C665F 344D271E1521192C3144353B9A7D6773437D545C6C685558 5C6C9AEAEDC87D9C9EB78895E6E4D2D7BFDBE4BAB7BAB0AC AAA6A19F9C97939287817D77706D685F 32401319204B7BA2AFB7B079929079635F884C4245464579 7A9193DBE7D58EA19FDED28ACDD9DAD5C6E0E6B2AEB2ABAB A3A3A19D9997938F8D88847C75746F65 2D49291F2598A598F8F5F4ACAB847F6D646D5A5C43535B89 989F92AFF9F3ACD7E8EBEA93DDDECCB5C1D7DDB8B2B1ABAC A6A6A39E99958E878A87847F78777266 495D4D3F27A8736AF3F8F166653E5B7265655446344E527B 7C757E86C3F7AEDFEFF3F0718EA8B7ABBDC5C1B7AFAFB0B2 ABA9A49E9B96908A84807F7D77746F65 7968341E168D8FD3E4E3641F4F2C7B495F5736384342498E BEC7D5CAABDAA9D6EFECE39E9783747064707EB1B6B3ADA3 A7A39F9C99948F8D857E7C7C76706A63 3A5227121D3F3247402425273729324E4D5A4C514F434761 B2C3C2C0B1A79CD1E7F7E9DEE2DED0D1C0AC90BCB2AEB5B0 AAA7A5A49E9691918A807C7C746B6660 4A5629221727262923264461444C5486597150979E8B928C 7CA7CCBBB9A7B0CFEDE3EED6D0D5C1CBCDABBBB8B7B5B9A8 ADABA7A39E9994908B867E77726C6763 6A69313927535A251C2B444D505F6771918068B5A99BB5B4 A887BBC5C1BFCEDBE6FEE0DFE4CBCCCCA998D6B9BBB3B8B5 B2B0ADA8A39D96928D88817A746E6864 6D774052334E58221C2F35223D4F7173AB946CA9B3B5B4AC B2A08BBCC0C5CADEEDF5E6E2DBD8D1B498D5EAB9BAB9B7BB B5B3B0ADA8A29C98928D87817B756F6B 7D7F37453B372A15112321183934565E6C7267A0ABB0A9AE AFBA9C96CAB8C8DFEBF7E1E2D4D1C98DA5E0EBB4B7B9B4B4 B2B0AEABA8A4A09D96938E89847F7975 6F76362216191314141F111B3D304752515065B0A5A4A9B0 B0A9BB97ACC3C6E3EAF4EEDDD6C58B90B490E9B0B5AFB1AD AEACA8A6A3A19E9D97938E8985807A76 7F773C252261581519251217363C5E73697674A9A5A6A2A7 ABA9ADB297C7C2E0E8FFD9DECF9D8298BD9FE4B4B1AAB0AC ACAAA6A29F9C9997938F89847F7A7471 777E4F4D297E7E1B0E1E1B1D3D4C6F8074A0859A9EA29FB0 ABB4ADB4B7B8CEDEF0F0CB9B9FB8879EC5ECE3B4ACADAEAC ABA9A6A39F9A95918F8B86817D797572 879050662D7975161817161643526E7499A1789A9DA2A4A2 A8AAB0B7B3BFC9DEE9F9AF3F7DE4929BC8ECE9ABABACABAC AAA9A7A5A19B948F8E8B8682807E7B79 88904D664041471A121B141D332D5C618490889F98A1A6A6 A9ACB1ADB2BDC9DDF0EEBA40A9E890A0CDEEE8ADAAA6ACA6 A8A6A4A19F9C9997918D87827F7E7E7E 999A5236291A1C16180D1F172C2B61493E43579CAC9EA4A9 A9ABB0ADB2BEC9DEF1F1BE3FB6E993A8CEEFE8AEABA7ACA7 A8A7A4A29F9C999694918C8885838180 8C8F54211C3630171920102C3D315223273047A6989EAAA5 A9ABB0AEB3BECAE0EEF2C23FCBE790AACFEFE8AEABA7ACA7 A8A6A3A09E9A97959492908D8B888583 93966B4D288B821F14181C28322B434F3A3C42AAA9A7A5A4 ACADB2B0B5BFCAE1ECF3C646E1E88DA7D0EEE6AEABA6ABA7 A7A5A29F9C999693908F8E8D8C8B8987 94926B6A2C949B1F171B1B1B4A3E81658B6E366593A4ACB6 B0B0B4B3B7BFCAE1EFF4C954EEEB8FACD2EFE7AFADA8ADAA A8A6A3A19E9B989591908E8C8C8B8A89 9D99696E3C5C6B2415171A1A5D312F7B744F2E7889ABA7A9 B3B1B5B4B8BFCAE2F1F4CA65EEEA92B2D5F1E8B2B1ACB1AE ACAAA7A5A3A09D9A9795928F8E8D8C8B A29C54452F1D22131518141D1A2B2C2B4125399298AAA9BB B2B0B5B4B8BFCAE2F0F4D07DEAE68FB2D7F1E9B3B3AEB4B2 AEADAAA8A6A4A19F9C9A97959392908F A198381B1C1A18201A233D464D4022496583915EA1ABB4AF B1AFB3B4B8BFCAE3F0F8DA94EBE68DAFD7F1E8B3B4AFB4B3 AFADABA9A8A5A2A09C9B999897969492 A2903F2B19171A191C415E886170A39D74432878B3ABA9AE ADA9B9B1AFBDC3DFF1F1DDBDEFE783B6D5F3E7B5AFB1B3B1 B0ACA9A9A6A19E9E9B9A989696969595 947F4F7037171D2925A992C5BF978181815125A7B2AAABA7 ACAFAEA9A8A8BCE4F4F7DFC5E5F181B2D5F5E8B3ADADADAB ADA9A7A7A5A09D9D9997959393929190 96704988431D1B278D75A7DE72394B8D837E25AEA3A9A7A9 A0A9A3ACA47D94DCEEF5E0C7ECE982A4CDF1E4AEA9AAA9A8 A7A5A4A4A29E9B9A97969391908F8D8C 958E7486391C1C3DA66DADE19C3A394A476824ABA2A79C9B A3AAA0A59F7588E2DDF5B6CDF0DD7591C4EEE1A9A6A7A6A6 A2A1A0A09E9B97959493908E8D8B8987 9392693F1D1708269DA8DE8B3B1B2E1D1824229F9B9AA29F 98A2A69D9467508CB0CE4AC5E2E9759FC3F1E2A6A3A4A1A2 A1A09F9D9B999593908F8D8B8A888685 8B967F4D483D1D1F25403819293338497C7A7AA4A1969C9D 9F969D978A63569CE0CA33C7EBE66991BFF1E1A2A1A3A0A2 9F9F9D9A98979591908F8E8D8C8B8988 8E8F8B8A9A8E5E181C071A181D393AAC9DA8A19A9F9A9393 9A919CA28D5D4D76D98430B3E4D2547EB9EEDD9C9C9F9CA0 9B9B9995949493908E8E8E8E8E8E8C8B 8C8B89948B90923F1D2325251F5F899DA798979A8D8D928C 868E8D8D8165482FB34331B7D8D64A83B9EFDC9796979397 979794908F91918E8A8A8A8B8C8C8B89 898A908F8B948B6B272422302F3E9C9493908C8988868482 807A8A7F754F4427232A44BBE2D04B89BCF2D890918D8D93 928E89888A8B89878685848382828181 8C87888683878677281F2A2B295884958B8884817E7D7B7A 767B73777B49362730366DACCDDC4974B3EDD88D888A8D8A 8684828283817D797A7B7D7D7D7B7A79 8B837E7D7B787A7D5B1D181824738B81807D797573727170 6E756B6F7D50263A363C83A3C9E66266A4E8C6827982877E 7D7B7979797873706F707171706F6F70 8480797776706E755F4C1F1F5873747673716E6C6A6A6B6B 6965746C746526563E4685B2E4EB9C7C98E59B706A727872 7774706F70706F6D6A69676360616468 7C7C7772726F6B6C75642643696D68656968666564656768 675C6F696B7442633F4988B9EEE5C89D91DB6D5F5F616468 6B6A68686A6B6B6A6664605B5756585B 7776726D6B6E6D686C6875C16F6E6C696262616160606263 65615E6869746860384293B0E3E5E0BB85BA52555A54555D 5F606265686866655E5D5B5854504D4C 726D6D6A63666A63626E72CA6D6B5A68616161605E5D5D5E 5E625763646A725C353F96ACE4EDEFC56D825051574E5154 55575A5E6162616057555352504C4743 6D656A6B5F5E625C5F696DCF6E61685F636363615D5B5A5A 555A5C5B585F655C303984A7E7E6EBB258545750554E544F 4F4F505355585A5B54504C4A4A494541 6563605D5A5959595B5C67D75D60585C5C5C5E605F5B5A5A 5B59575556585A5C2D3682A2E0E5E99453504E4D4E4E4C4A 4A4A4C4D4E4E4E4E494A4B4946434141 5E5D5A5755545353555661D5585B54575A5A5B5C5B585759 585756555657595A3C2D7A93E9E2EA6B4D4B484849494745 4647494B4C4B4A483E3F3F3E3D3C3C3D 565452504E4D4D4D50515DD7575752545755555554535356 565656575758585846266C92E0E3C6504947444444444241 40424548484542403737373636363839 4F4E4C4A494949494C4E59DC5654505252504E4E4D4C4E52 51525455555555544C2B4F9BD8E68449444240403F3F3E3D 3C3E4042413E3B393535353433333333 4848464544444444454752DD524D4A4B4B4947474645484B 494B4D4E4F504F4F523B3495E5C753403F3D3C3B3A3A3938 3A3B3B3B3A3836353232323232302F2D 424141403F3F3E3E3F414BDF4D45434343414040403F4044 444546484A4B4C4C4A4A377EDB7C453B3D3C3B3A39383837 39383837353433322F2F303131302E2D 3D3D3C3C3B3A3A3A3B3D47E0493E3D3D3A393A3B3A38393C 3D3E3F4143464849424A45619343433E3D3D3C3B39383838 37373635343231302F2F2E2F30302E2D 3C3B3B3A39393838373942DE453938373535363737353537 363637383B3E414346414349463B3F3F3B3B3A3937363636 363636353432302F2F2D2C2B2C2C2B2A pop P % End of image MathSubEnd P % End of sub-graphic P p % Start of sub-graphic p 0.0238095 0.522676 0.477324 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [(0.838331)] .5 1 0 -2 Msboxa [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p [(0.838331)] .5 1 0 -2 Mshowa P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage C8DFE1D0DBFAFBE1D39A646695B7AD92A9ABA594827F8FA0 C4CFE1F1FAFBF6F2FBF0E0D5D5E0F0FBF6F9FEFFFFF9F3EF EDE2D0BBA99C94919EA6B4C1CCD2D4D5 CBE0E1D2DDF8F1D1E3B18489B2CAB89A999E9D92868A9FB3 C4CFE1F1FAFBF6F2FBF1E2D8D8E2F1FBF6F9FDFFFDF7F0EB E8DECDB9A89C96939CA3AEBAC2C5C6C5 D0E2E1D4DFF4E0B3CBA78B98BCCBB2908F9598918B94ADC2 C4CFE1F1FAFBF6F2F9F1E6DEDEE6F1F9F7FAFDFDFAF3EBE6 E0D6C7B6A79E9997A1A6AFB6BABAB8B6 D8E5E2D6E3EFC88D83726C85ABB79F81999E9F968D93AABE C4CFE1F1FAFBF6F2F8F3EBE6E6EBF3F8F9FAFCFBF6EDE4DF D4CCBFB1A6A09D9DAFB3BABFC0BEB9B6 DFE9E3D9E7E9AF644E4B577BA3B4A58FAFB1AD9D8D8C9DAF C4CFE1F1FAFBF6F2F6F4F0EEEEF0F4F6FAFBFBF9F2E8DDD7 C7C1B6ACA4A1A2A3BDC2C8CDCFCCC8C4 E7ECE3DCEBE4983E5356688AAEC1BDB1B9BAB4A18E8B9AAB C4CFE1F1FAFBF6F2F5F5F5F6F6F5F5F5FBFCFBF7EEE2D6CF BCB7AEA7A3A3A6A8BEC3CCD3D7D7D5D3 ECEEE4DEEDE0872074768095ADBCBEBAAEB2AFA19395A8BB C4CFE1F1FAFBF6F2F3F6F9FCFCF9F6F3FCFCFAF5EBDED1CA B3AFA8A3A2A5A9ACAFB5C1CCD4D7D8D7 EFEFE4E0EFDE7D10888688919DA7ABAA9EA4A69F98A0B7CD C4CFE1F1FAFBF6F2F3F6FBFFFFFBF6F3FCFCFAF4E9DCCFC7 AEAAA5A1A1A5ABAF9FA7B4C2CCD2D5D5 F5E1D9EAF1BE55004E445E94B1AFBEDDAAA39992939BA7AF CBD3E1F1FDFFFFFFEDEFF2F6FBFFFFFFF0F0EFEBE2D5C9C2 B4B5B6B7B8B8B9B9C5C8CED4DBE1E6E8 DCE7F0E4BD80421C594D6191A59DA6C2B9B0A3989599A2A8 C9D0DDEAF4FAFCFCEEEFF2F6F9FDFFFFF4F4F3EFE6D9CDC6 BEBEBCB8B3ADA7A4CBCDD1D5D8D9D9D9 C9E9F6CA78392B376556668F9D8F93ADC1B8AA9E999DA4AA CAD1DCE7EEF1F1F1EFF0F1F4F6F9FBFCF9FAF9F4EBDFD3CB C7C7C5C0B7ABA099CBCFD5D9DBD9D5D2 D3DDCF95481A1D3266576892A19499B3B6AEA49D9EA7B3BB D0D7E1EBF1F3F3F1F0F0F1F2F3F3F4F4FCFCFBF6EDE1D5CE C3C8CDCFCBC0B4ACBEC7D4E1E8E9E5E1 F0C6895637281D165C506493A9A0AAC6A09B96969FAEBFCA D0D7E3EEF7FAFBFAF1F1F0EFEEEDEDECF8F9F8F3EADED2CA B5C0D1DEE3DED4CDA7B6CDE4F2F6F4F0 FDAD512A343C240452465B8CA29AA5C197938E8E96A6B7C2 BEC6D5E5F1F9FDFEF2F1EFEDEAE8E6E5F0F0EFEBE1D5C9C2 A7B7CEE2EBE8DED592A4BFD8E7E9E2DC EE9D411D2D3D2A0D4E40507B8A7D839DA49C9188888F99A1 9CA7B9CEE0EDF4F7F3F2EFEBE7E4E1E0E6E6E5E1D7CBBFB8 A0B0C8DBE0D7C7BB8898B0C3C8BFAFA3 D796482125322D1F4F3E496C75606078B5AA98877C7B7E82 828EA2BAD0E0E9EEF4F2EFEAE6E2DEDCDFE0DFDAD1C5B9B1 A0AEC3D1D1C1AA9B8593A5B1AC998170 6A6A4D26264039182C6F5E425A433A8392887A6E696D747A 6878A6CEC4A3AED6C0DAE5E2F4FFF5C7DCD9D4CDC5BEB9B6 B0AFADAAA7A4A2A18785817B756F6B69 34351C000122220522523D3D7C6D4365837A6C615D61696F 6777ABE4E3B59DA794AAB1ADC3E4D9B4DDD9D3CBC2BAB3B0 AFAEACA9A6A3A1A08785817B756F6B69 2E311C0214404A33405E3D4BA2975357736B5E5451565F66 6B73A8F1FFCE958098A6A195ADD8DBBEDBD7D0C7BDB3ACA8 ADABA9A6A3A19E9D8785817B756F6B69 3B3F2C18326A7E6D9BB58473AB9660766D655A5150576168 796F94E1FFDFA78CD8DBC6ABBBE6EED6D4D0C9C0B7AEA7A3 A9A8A6A3A09D9B9A8785817B756F6B69 383A25112F6D887CF9FFD792937160A36D665B54555E6971 8F7482C1EADDC4BEFDF9D6ADB0D1D5BBC4C2BDB8B2ACA8A6 A6A5A3A09D9A98978785817B756F6B69 56543B223E7C9A8FFFFFD87F6C4A4FA767605752545E6B74 A58889B2CBC6CCE2EFE9C49591A9A485AEAEAEAFAFAFAFAF A3A2A09D9A9795948785817B756F6B69 6863422239759287ADC176384E3E3374575149454854616B B5A5ACC1BBA7B5DCEBEBCDA4A1B5AB88999CA0A7ADB4B8BB A1A09D9B989593918785817B756F6B69 433B1600043D584E52570F0040421E3D48433B373C485660 BCBBCCD8B9909AC5FFFFF2D1D3E8DCB78C9098A2ADB7BFC3 9F9E9C99969391908785817B756F6B69 4C4E351318363314303845525D6365666B5B678C9684859D 8D9DB3C8D1CDC3BBEADCD1D2DCDFD5C898C0D0B8ADBEC3B3 AFADA9A39D9793917E7B77726B66615F 6D6D522E304C46262A313C49555D6163928089ABB19A99AF 97A1AFBEC7C9C8C5EEE3DADCE2DECCBB9AC2D1B9ADBDC1B1 AFADA9A39D97939184827E78726C6866 7B7B5D35334B432120262F3B48535B609D8A93B3B8A09EB4 A6A7A9AFB8C3CED4F4EBE5E7E8DABFA79DC5D3B9ACBBBEAE AFADA9A39D9793918E8C88827C767270 6D6B4B211C312705181B222D3B4B58607968759AA49293AC B3ACA4A2ABBED3E1F8F0E9E8E5D2B095A2C8D5BAABB9BBAA AFADA9A39D9793919795908B847F7B78 6867471C182D230115161A2434485B675B4D5F8B9D9198B3 B8AEA29DA6BCD5E6F8ECDFDAD5C3A48BA6CCD8BBAAB6B7A5 AFADA9A39D9793919A98948E88827E7C 7B7A5C34334A422118171821324B6372695B6D99AB9FA6C1 B5ADA3A0A9BDD4E3F3E0CABEBAB19D8CAAD0DABCAAB4B3A1 AFADA9A39D9793919896918C85807C79 85866B4649645F3F1E1B1A2235516C7E877682A6AE9A9AB2 ADAAA6A8B1C0D1DBEDD2B1A09E9F9A93AED3DCBDA9B2B19E AFADA9A39D97939193908C86807B7674 7E8067454A686546221E1C2337557386988388A2A1847E92 A7A7A9AEB7C3CED5E8C9A18B8C959999AFD4DDBDA9B1AF9C AFADA9A39D9793918E8C88827C767270 81866F4A4655421A030A17273949555CA07F7999A8958C97 9EAAB4B3B0B7CCDFEEF4B840BBF76BC6D0EBE6BAA1ADB3A6 A8A7A4A29F9C9A988F8E8C8986838180 9C9162281B2D25050F141D2936424B503F314B8AAEA49BA4 9EAAB4B3B0B7CCDFEDF5BB43BEFA6CC6D0EBE6BAA1ADB3A6 A8A7A4A29F9C9A98918F8D8B87858281 AA975D1E14333C26161A212B353E454914113B8AB8AFA1A7 9EAAB4B3B0B7CCDFECF6BE49C4FD6DC4D0EBE6BAA1ADB3A6 A8A7A4A29F9C9A989392908D8A878584 9D946C40456D79640C121C2937444E534D3D5490B1A599A2 9EAAB4B3B0B7CCDFEAF7C351CCFF6EC3D0EBE6BAA1ADB3A6 A8A7A4A29F9C9A98969593908D8A8887 9196816267827B59000614263A4C5A617B595378918F95AB 9EAAB4B3B0B7CCDFE9F8C959D4FF6FC1D0EBE6BAA1ADB3A6 A8A7A4A29F9C9A9899989693908D8B8A 969A815950583E12020916273949565D6C43375A7B869CBC 9EAAB4B3B0B7CCDFE7F9CE61DCFF70BFD0EBE6BAA1ADB3A6 A8A7A4A29F9C9A989C9B999693908E8D 98926934273426011D1F252C343B40436343426E8F95A1BB 9EAAB4B3B0B7CCDFE6FAD267E2FF71BED0EBE6BAA1ADB3A6 A8A7A4A29F9C9A989F9E9B999693918F 938350181336402B363533312E2C2A297C646D9CB6A8A0AB 9EAAB4B3B0B7CCDFE5FBD46AE5FF72BED0EBE6BAA1ADB3A6 A8A7A4A29F9C9A98A09F9D9A97949291 D2742C28260C0A262A517B887C737F9077221978B6A5A7D3 AE9EA4BAB8ACC8F7EEFFD8B2E3D59DA7D0ECE6BAA2ADB3A6 B0AFADAAA7A4A2A19898989898989898 A86D484C401B132A446D9AA89B8F97A5A4564996BF9D8EAC AC9DA3B8B4A5BDEBEDFFD1B5EBD99DA9CFEAE5B9A0ACB2A5 AFAEACA9A6A3A1A09797979797979797 7D6E6C6E5123182B6589ADAD8D6E666B945B589CBB968091 A99AA0B4AC98AAD4EBFAC3B8F6DC9BABCDE8E3B79EAAB0A2 ADABA9A6A3A19E9D9595959595959595 747F85714117132598B2C4AD75402724472C4085AB9A8C98 A5979DAFA28691B6E3E2ACB7FFDC94A9CAE5E0B49BA7AC9F A9A8A6A3A09D9B9A9292929292929292 87968E5F2910131B93A8B2976134252834304D84A5A29DA4 A0939AA997737696D5C28DB0FFD687A0C6E2DCB098A3A99C A6A5A3A09D9A98978E8E8E8E8E8E8E8E 91A1905B36312917253A4A3E231A2D457177879BA5A39F9E 9C9097A48D615D78C39F6BA4FFCB7594C3DED9AD94A0A699 A3A2A09D9A9795948B8B8B8B8B8B8B8B 809994746E77551C00000D09041849749AA5A79D96989996 998D94A085544A61B1814E97FFC06486C1DCD7AB929EA496 A1A09D9B989593918989898989898989 698C9992A4B37923263339312E4C88BB8E9E9D887F8B9695 978C939E814D3F55A6703C8FFCB85A7EC0DBD6AA919DA295 9F9E9C99969391908888888888888888 908F8D8A87848281152A3D3E3C5283AE91908E8B88858382 6D76808172553520080847AED4A679759AE5EC9D7CA5AA7C 9593908B87827F7D817F7D7A77757271 8E8D8A888582807E23272B2D38547D9B8A888683807E7B7A 6B747E7F7156382525275EB7D5A67469A6E3DF907198A179 8F8E8B8783807D7B7D7C797774716F6D 89888683807D7B7A402D1C203B5E79867D7C7A7774716F6E 6870787A6F583F2F434A7AC0D7AE7C66B5DCC87D60849073 8584827F7D7A7978767572706D6A6866 8382807D7A7775746342242A4E727E7A72716E6C69666462 646A72736C5B493C475A88C1DCC79A7BBDCAAA6953707C6A 77777675747473736D6B696663615E5D 7C7B797673706E6D7C5F454C6B8383776B6A6865625F5D5C 60656A6D685E524B335587BADFE6C59FB5AD885A4E626A5F 69696A6A6B6C6D6D63615F5C59575453 767573706D6A68677A726E7480847B716A696764615E5C5B 5C5F646665615C581E4F83AEDCFBE5B79F886854545C5B54 5B5C5E606365676859585653504D4B4A 71706E6B6865636261768C92857367646D6C6A6764615F5E 595B5E6163636362195285A4D4FFEDB8846750535E5D524A 515255595D60636552514F4C49464443 6F6E6C696663616049729BA083625557706F6D6A67646261 58595C5F626466671D5A899FCCFCEAAF72524254665F4D45 4B4D5055595D61624E4D4B484542403F 5858585858585858585E6EEE4D7650605858585858585858 61616161616161611E496C8BCCFFD7854848484848484848 50505050505050504040404040404040 5656565656565656555C6CEB4B734D5D5656565656565656 5E5E5E5E5E5E5E5E2947648FD8FFCD714747474747474747 4E4E4E4E4E4E4E4E3F3F3F3F3F3F3F3F 5151515151515151515767E6466F49585151515151515151 59595959595959593A435993E5FFB8524444444444444444 49494949494949493C3C3C3C3C3C3C3C 4B4B4B4B4B4B4B4B4B5161E0406942524B4B4B4B4B4B4B4B 53535353535353534A3E4D93E5F099364141414141414141 43434343434343433939393939393939 4444444444444444444A5ADA39623C4C4444444444444444 4C4C4C4C4C4C4C4C5239458CCFC572253E3E3E3E3E3E3E3E 3C3C3C3C3C3C3C3C3636363636363636 3E3E3E3E3E3E3E3E3E4454D3335C36463E3E3E3E3E3E3E3E 464646464646464651354280A6874A233B3B3B3B3B3B3B3B 36363636363636363333333333333333 3A3A3A3A3A3A3A3A393F4FCF2E5731413A3A3A3A3A3A3A3A 42424242424242424B3342727949282A3939393939393939 32323232323232323131313131313131 3737373737373737373D4DCC2C552E3E3737373737373737 3F3F3F3F3F3F3F3F4631436A5C2314323737373737373737 2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F pop P % End of image MathSubEnd P % End of sub-graphic % Start of sub-graphic p 0.522676 0.522676 0.97619 0.97619 MathSubStart %% Graphics /Courier findfont 10 scalefont setfont % Scaling calculations 0.0238095 0.014881 0.0238095 0.014881 [ [(1.25015)] .5 1 0 -2 Msboxa [ 0 0 0 0 ] [ 1 1 0 0 ] ] MathScale % Start of Graphics 1 setlinecap 1 setlinejoin newpath [ ] 0 setdash p [(1.25015)] .5 1 0 -2 Mshowa P 0 0 m 1 0 L 1 1 L 0 1 L closepath clip newpath % Start of gray image p .02381 .02381 translate .95238 .95238 scale 64 string 64 64 8 [64 0 0 64 0 0] { currentfile 1 index readhexstring pop } Mimage E2C0D7F3D4C6DDE2DF9D6A78A5BCB9B0B5B7A382788CA2A9 C4D5EAF8FBF9F9FBF9F1E7DFDFE7F1F9FCFCFBFAF8F7F6F5 DEDCD9D2C8BEB4AF9CAEC3CBC5BFC0C4 DAC4DAEDDCE6F4DDE8B693A2BDBEAA9B9DA79E878091A1A3 C4D5EAF8FBF9F9FBF9F2E8E1E1E8F2F9FCFCFBFAF8F5F2F1 DAD4CABDB0A49C98909EAEB8BBC3D1DD D8D1DEDCD7F9F3ACB9A09AB1C2B3988A8C9B9B8B8695A09E C4D5EAF8FBF9F9FBFAF4ECE6E6ECF4FAFBFBFBFAF6F1EDE9 DED3C0AC9D93908F999FA7ACB3C1D4E2 DEE0E2CAC8F5D45F625D6F94A9A1959398A39F8B8595A3A3 C4D5EAF8FBF9F9FBFBF6F0EBEBF0F6FBFAFBFCFAF5EDE5E0 E4D6BFAA9D9A9DA1B5B7B8B9BABDC3C7 E0E5E5C9C9F4C0353F3D537D9AA1A7B3B4B7A7887F92A7AC C4D5EAF8FBF9F9FBFBF8F4F1F1F4F8FBF9FAFCFAF3E8DDD5 D8CBB7A7A0A4AEB6C1C4C9CDCEC8BEB6 DDDFE6D9DAF7BB3363586285A4B0BBC9BFC0AB887D92A9B0 C4D5EAF8FBF9F9FBFCFAF8F6F6F8FAFCF7FAFCFAF2E4D5CC C2B8A99E9DA5B2BBB8BCC5D2DCDACDC1 E2D9E7E9E0E3A12785706F8FAFBABDC2AEB4A88C8496A9AC C4D5EAF8FBF9F9FBFDFCFBFAFAFBFCFDF7FAFDFAF0E0CFC4 B8B1A79F9FA6B0B8B7B5B8C5D6DDD8CF EBD9E6EDD8C37B0B836A678AAEB7B2AF96A4A3918C9BA7A6 C4D5EAF8FBF9F9FBFDFDFDFDFDFDFDFDF6FAFDFAF0DECCC0 BDB7AFA8A7ABB2B7C3B8B1B7C7D4D5D1 F7E5E5F9F2B76B3A35467673CEA7C6E4B6AC9E93929BA7B0 C4CFDFEDF4F3EDE8F6F7F7F8F9F9FAFAFFFFFFF9EBD8C5BA B6B2A99F9A9FACB7BABDC4CED7DCDDDC EAE9F0EABB6D30174A567C6EC092AFCBACA49A9396A2B1BB C6D1E2F2FCFEFBF8F9F9F9F9FAFAFBFBFCFCFCF7EEE1D4CC C6C3BDB5AEADB1B5C4CAD2D6D7D9DEE2 E7F2F9D98734141C61668167B07D98B4B0A99F999CA6B2BB C3CDDEEFFBFFFFFFFCFCFBFBFBFBFBFBF8F8F8F5F0EAE3E0 CDCDCDCAC5BCB3AEC4CFD9D8D1D0DBE6 E0DCCDA05519163365677E60A87794B2BBB4AAA3A2A8B0B6 C2CBD9E7F2F7F8F8FDFDFCFBFAF9F8F8FBFAF8F4EFEAE5E2 C5C9D1D8D9CDBAABB8C8D7D6CECDDBEA E0B37C4C2208122C565A755BA87B9BBBB0ACA7A4A7AEB7BD CAD0DBE6EFF4F6F6FCFCFAF8F6F5F3F2FDFCF9F4EBE1D7D1 BFC6D4E6EFE5CCB7B1C0D2D9D7D8E0EA F9AA53271C181B24464D6C56A47695B394939499A2AEB9C0 C9CFD9E4EFF7FCFEF9F8F6F3F0EEECEBF3F5F6F1E6D5C4BA C1C7D6EEFDF5D8BEABB6C6D6DEDDD6D0 F7A0482930342D28404868519A647A938B8A898A8E959CA0 ADB4C1D0E1EFFAFFF4F3F0EDEAE7E4E3DFE5EDEDE3CEB8A9 BDBFCBE1F1E9C9AC9B9DA8BDCDC7AB92 CC7D332232372C234149684D90515F7396918A827B777574 8B93A3B7CDE1F1F9F1F0EDE9E6E2DFDECED8E5EAE1CCB3A2 B3B1B9CCDBD1AF90878288A0B3A87E56 7F67223F1A3F18204A3453518B2B417E9D966E63786A6188 8E85B8D4F9E19BD6EACFB0CCF4D1B6DDC1E9EDBEA5B7C0B0 A7ABAFB1ACA297908B89857F79736F6D 051A0B4422431A2319164047994B495C7D7D5F596E5A4B6E 505DA7CDF2DD9CDCA6A798B2E6DFCAE2D2F6F5C7AAB5B8A7 A4A8ACADA89F948D8684807A746E6A68 4F582631001C113348424A2986687571656C5654674F3E61 5F72BAD2E8C87AAE8EAC9E9AC9D9C4C3B6D6DABBA9B6BCAF A1A3A6A6A199908A82807C76706A6664 41460E1E025C74A1A4B0AB5B9D848C74676E5750614E4671 8E91C2CCE8D27DA0ADDCC49CC1E6D8C9BCD2D6BFB1B7B7AC 9FA0A19F9B948D8885827E78726D6866 23381744419A8B8DE3FFFFA7BF8374506C70514351464E85 8A7E9CA8E8FCB8D6D0FFDB9DB9E7E4D8DDE7E3CFBCB3A89C A0A09E9B96918C898A88837E78726E6B 717535453794837BFFFFF2697447666E616545333F384A89 91839490D1F7C3E6EBFFD98E90A2958FA5ACB2B4B4B1ACA7 A4A29E9A95918E8D8C8A86807A74706E 535E1A1E138EA8BDDCB87E0B351E597E515B433540354483 ADAFC19EB7CDA1D1EEFFDAA09A8D7478787C8A9EADB1B0B1 A8A5A09B969392918886827C76706C6A 34603A36034D3F3F4435391666333839485A4C434D3D4681 AAC5E6B4B1BB9BDBD6F3E5D4E3D7C5D7AEA9ADB8BAAEA19D ABA8A29C9795949483817D77716B6765 5554192B0239222F192D4046454E687F6A616B899A969298 7EA3C6C6AFA8BFDCE5FFF3DFDBBEB5DFACC4CEBCADB1B6B3 ABA9A6A29D9996948C89837B736B6562 5A623149255C3D41203142474650697F877A7E97A7A6A7B0 9AA6B4BABBC0CBD5EEFBE2D3E3D1BCD4ACC7D3C4B6B8BBB7 AEACA9A5A09C99978F8C867F776F6966 6875465B35693F341E2A373B3B465D719182859DAEAEB2BD B7A9A1ABC3D5D6CFF1F8D7CCEBE1BCBCAAC7D8CCBEBFBFB8 B2B0ADA8A4A09C9B928F8A837C75706D 778144491D53220C131A222529364C5E746C7898ACABAAB1 BBAA9CA3BBD0D6D3E6FBE4D3EBDBAB9FA7C5D7CBBDBDBBB4 B4B2AFABA6A29F9D94928D87807A7673 797F352C04491E031315191D26374D5C58586F98B0AAA2A3 ABA9A5A4AABACFDDD7FFF6D7DBC4968AA9C5D3C4B4B4B3AC B4B2AFABA6A29F9D94918D88837D7977 737C32290C633F1F1E1C1C2332485E6D646379A0B5AEA3A4 9DA8B0AAA2ACC9E4D8FFEFC0BFB39086B5CCD2BDAAAAADA9 B2B0ADA8A4A09C9B908E8B87827D7A78 7587443E2883582E201C1B2338536A788D81869FADA7A3A8 9EAAB3B1ABB4CCE2ECFFC98DA0B39E93C9DAD8BBA5A7ADAC AEACA9A5A09C99978C8A8884807C7977 7E9758533B9059221914111C34516A77AD978C969D999DA8 A8ACB1B4B8C2D1DDFFF9A5628BBAB0A1D8E5DEBCA4A7B0B1 ABA9A6A29D999694898885817E7A7876 878F565845213F29201A1517243B54639A8C8B9BA39C9EA9 AAADAFAEAFB9CBDAF1F2BA2CC3DE9A9AC4F5DFAAA9ACA1A9 A8A7A5A29F9C9A99878684817E7B7978 8D974F3A2A1731071F1F212732404E56283B699AACA19AA1 ABAEAFAEB0BACCDAF2F2BD32C7DE999DC5F6E0ABAAACA1AA A6A5A3A09D9A98978E8C8A8784827F7E 8BA04F29243049030E141D2831393D3F061F548FA9A29CA2 ACAFB1AFB1BBCDDCF2F2C23DCFDE98A2C6F7E1ACABADA3AB A4A2A09D9A9895949493918E8B888685 82A75D38466A80250F141D28343E45495D4D54799BA5A7AC ADB0B2B1B2BDCFDDF2F2C94BDADD97A8C7F8E2ADACAFA4AD A2A19F9C999694939594918F8C898785 83AE6E50618293341F20242C3B4D5D678B5C436499B3B1AA AFB2B4B3B4BED0DFF3F2D05BE6DD95AEC9FAE4AFAEB1A6AE A4A3A19E9B98969593918F8C89878483 92AF6C515058691D1414151C2A3C4E595D372F63A4BEB4A4 B1B4B5B4B5C0D2E0F3F2D66AF0DD94B5CAFBE6B1AFB2A7B0 A8A7A5A29F9C9A999492908D8A888584 A1A5563B2716340D0E11171F272F35384F3E4775A2B1B1B1 B2B5B6B5B7C1D3E1F3F2DC75F9DD93B9CCFDE7B2B1B3A8B1 ADACAAA7A4A19F9E9A999794918E8C8B A69840270A001D14252D394346423B367C737689949AAEC7 B2B5B7B6B7C2D4E2F4F2DE7BFDDD92BCCCFDE7B2B1B4A9B2 B1AFADAAA7A5A2A1A09F9D9A97949291 AB7A4B331F0E1B380F487475718394957445177DBB9EB3AA AFB5B7B3B4BFD0DCF1FCC9AEF6D9A3ADCCFDE8B3B1B4A9B2 ACABA9A6A3A09E9D9897969593929190 816C5E573E1B111D546E9DB89E706D8A845B2D8BBF9AA99B AEA9ADB3ABA3BADDF4FFE1CFFED291A6CBFCE6B1B0B3A8B1 ABAAA8A5A29F9D9C9797969493919090 87827F75542F242D6F75ABDCB054467D8065409AC8A2B19F AE9AA2B59F7D9ADCE4FFD7E2FECF7FA1C9FAE4AFAEB1A6AE A9A7A5A29F9D9A999696959392908F8F A498815D37242F438291B8C88B34265050473089B79AB09F B0929CB9985F7ED4D1DA99D0F4D975A0C6F7E1ACABAEA3AB A5A4A29F9C99979695949392908F8E8D 978C6D401C131C268AACB688451E1A22383D2C7A9F84A08F AF929DB993526ABBDFC258BBECEA6C97C2F3DEA9A7AA9FA8 A2A19F9C99969493939291908E8D8C8B 83887D624D3F2911375A5B2B0E203A41717D659BAB8BA593 A4949EAE8B545C91F1BC34BBE9F35B8BBFF0DBA5A4A79CA5 9F9E9C99969391909291908E8D8C8A8A 8894958D8C845B2A0705060C1835658DA5B493B3B28DA895 93939B9C805A515FD0A11CC4E4EE4989BDEED8A3A2A59AA2 9D9C999794918F8D90908F8D8C8A8989 8E938E8897A07A4547160D384B456FB69AAB869E9672907E 8590978D765E493E967A08C7DBE53F8FBCEDD7A2A1A399A1 9B9A9895928F8D8C908F8E8D8B8A8988 898C90918E877F7A2E114C1C3E35968793928F8B88848180 7A8087837254352131234ECAC6E96576B9FADD8B8195908E 9392908E8C8A88878080808182838384 8B8B8C8A87837E7C3E10340F373F9A8C8C8B8885827F7C7B 70767D7B6C5237253B2B59C6C5E0636FB0F0D78C83918680 898887858381807F7A7A7A7B7B7C7C7C 8C8985807D7C7C7D57161F103952998781807E7B78767473 646A717167533E3046356CC0CADB6C72A6E0C7837E867773 7D7C7B7A797776767171707070707070 8A857D767374787A702B24324C678A73747472706F6D6B6B 5F646A6C675A4C434A3B80BBD8E38A89A3CDAC6D6C756B6F 73737372727271716767666564636262 837E766F6C6D71747D47416E6675725D6A69696867666565 6064686B69635C57463992B4E9F0B3AC9DB78B5157646271 6D6D6D6D6E6E6F6F5F5F5D5B59575655 7976726D6A69696A785D63A772745B576363636262626262 62636667676664623E349DA8F3F5D1C58A9C6F404E5A586C 636465666768696A5B5A585552504E4D 6F6F6F6E6B67625F686676C76B684E655F5F606060616161 60605F6060626364382EA299F2EEDBC96C7F5F4256594D5D 5757595B5D5E6061595855524F4C4948 686B6E706D665E5959677CD15E5B49775E5E5F5F60616162 5D5B5958595C5F61352BA48FEDE5D9C4546C5849625C454F 4D4E4F5254565859595855514E4A4746 5C5C5B59585655555D5B63DB6546655D6161616161616161 54555657595A5B5C2D3A8EBFBFF6F78A51504F4D4C4B4949 4C4C4C4C4C4C4C4C4141414141414141 5A595857555453525B5961DA6445635A5E5E5E5E5E5E5E5E 55555658595B5C5C3C3073B5C6ECDF7E4D4C4B4948474545 4A4A4A4A4A4A4A4A3D3D3D3D3D3D3D3D 55545352504F4E4D55555ED862425E555858585858585858 555657585A5B5C5D4E2450ADD9DFB6684646454342403F3F 47474747474747473737373737373737 4F4E4D4C4A4948474E4F5BD6603E594E5050505050505050 5354555658595A5B561F3CACEED1874E41403F3E3C3B3A39 42424242424242423131313131313131 4848474544424141474957D35D3B53464848484848484848 4E4F505153545556522939A4EEB95D3C3D3D3C3A39373636 3D3D3D3D3D3D3D3D2D2D2D2D2D2D2D2D 4242403F3E3C3B3A404353D15B374D3F4040404040404040 4747484A4B4D4E4E483D3E84C8913E3B3D3C3B3A38373635 39393939393939392D2D2D2D2D2D2D2D 3D3D3C3A393736363B3F50CF5934493A3A3A3A3A3A3A3A3A 3F4041434445474740554051865F2A483E3E3D3B3A383737 35353535353535352F2F2F2F2F2F2F2F 3B3A393836353433383D4FCE593347373737373737373737 3B3B3D3E3F4142433C643E29533C2055403F3E3D3B3A3938 33333333333333333030303030303030 pop P % End of image MathSubEnd P % End of sub-graphic P P % End of Graphics MathPictureEnd :[font = output; output; inactive; preserveAspect; endGroup; endGroup] GraphicsArray["<<>>"] ;[o] -GraphicsArray- :[font = section; inactive; preserveAspect; startGroup] Timing :[font = text; inactive; preserveAspect] Most of the computation time required to transform, quantize, dequantize, and reconstruct an image is spent on forward and inverse DCT calculations. Because these transforms are applied to blocks, the time required is proportional to the size of the image. On a SUN Sparcstation 2, the timings increase (at a rate of 0.005 second/pixel) from about 20 seconds for a 642 pixel image to about 320 seconds for 2562 pixels. ;[s] 5:0,0;367,1;368,0;409,1;410,0;421,-1; 2:3,13,9,Times,0,12,0,0,0;2,21,13,Times,32,12,0,0,0; :[font = text; inactive; preserveAspect; endGroup] These times are much longer than for comparable functions written in a low-level langauge such as C. For example, a C program performed the same computations in under 2 seconds for an image of 2562 pixels, more than 100 times faster than our Mathematica functions. However, for the purposes for which our code was developed, namely education, algorithm development, and prototyping other applications, the timings are acceptable. ;[s] 5:0,0;196,2;197,0;242,1;253,0;430,-1; 3:3,13,9,Times,0,12,0,0,0;1,13,9,Times,2,12,0,0,0;1,21,13,Times,32,12,0,0,0; :[font = section; inactive; preserveAspect; startGroup] References :[font = text; inactive; preserveAspect] Ahmed, N., T. Natarajan, and K. R. Rao. 1974. On image processing and a discrete cosine transform. IEEE Transactions on Computers C-23(1): 90-93. :[font = text; inactive; preserveAspect] Chen, W. H., and W. K. Pratt. 1984. Scene adaptive coder. IEEE Transactions on Communications COM-32: 225-232. :[font = text; inactive; preserveAspect] Jain, A. K. 1989. Fundamentals of digital image processing . Prentice Hall: Englewood Cliffs, NJ. :[font = text; inactive; preserveAspect] Puri, A. 1992. Video coding using the MPEG-1 compression standard. Society for Information Display Digest of Technical Papers 23: 123-126. :[font = text; inactive; preserveAspect] Shannon, C. E., and W. Weaver. 1949. The mathematical theory of communication . Urbana: University of Illinois Press. :[font = text; inactive; preserveAspect] Wallace, G. 1991. The JPEG still picture compression standard. Communications of the ACM 34(4): 30-44. :[font = text; inactive; preserveAspect; endGroup] Watson, A. B. 1993. DCT quantization matrices visually optimized for individual images. Proceedings of the SPIE 1913: 202-216 (Human Vision, Visual Processing, and Digital Display IV. Rogowitz ed. SPIE. Bellingham, WA). ;[s] 2:0,0;219,1;220,-1; 2:1,16,11,Times,0,12,0,0,0;1,16,11,Times,0,12,65535,0,0; :[font = section; inactive; preserveAspect; startGroup] Biography :[font = text; inactive; preserveAspect; endGroup] Andrew B. Watson is the Senior Scientist for Vision Research at NASA Ames Research Center in Mountain View, California, where he works on models of visual perception and their application to the coding, understanding, and display of visual information. He is the author of over 60 articles on human vision, image processing, and robotic vision. :[font = section; inactive; preserveAspect; startGroup] Electronic Supplement :[font = text; inactive; preserveAspect; endGroup] The electronic supplement contains the packages DCT.m and GraphicsImage.m, and the image file shuttle. ;[s] 7:0,0;48,1;53,0;58,1;73,0;95,1;102,0;104,-1; 2:4,16,11,Times,0,12,0,0,0;3,16,11,Courier,1,12,0,0,0; :[font = section; inactive; preserveAspect; startGroup] :[font = text; inactive; preserveAspect; endGroup; endGroup] Andrew B. Watson NASA Ames Research Center beau@vision.arc.nasa.gov ^*)