Maple 9 の改良されたパッケージ: Part 2
|
StringTools
|
|
|
メトリックス と 距離
|
|
Warning, the assigned name Group now has a global binding
| |
>
|
HammingDistance( "Mathematics", "Mathematische" );
|
| (1.1.1) |
>
|
EditDistance( "Mathematics", "Mathematische" );
|
| (1.1.2) |
>
|
PrefixDistance( "Mathematics", "Mathematische" );
|
| (1.1.3) |
>
|
SuffixDistance( "Mathematics", "Mathematische" );
|
| (1.1.4) |
>
|
SimilarityCoefficient( "Mathematics", "Mathematische" );
|
| (1.1.5) |
|
|
パターンマッチング
|
|
•
|
パターンマッチングルーチン Search と SearchAll が拡張され、複数のテキストの同時検索が可能になりました。これにより、Search の処理を分けて行うことにより、map2 を使用して Search を 1 回コールするよりも効率的になりました。
|
>
|
Pattern := Random( 1000, 'lower' ):
Texts := [seq]( Random( 5000, 'lower' ), i = 1 .. 5000 ):
evalb( Search( Pattern, Texts ) = map2( Search, Pattern, Texts ) );
|
| (1.2.1) |
>
|
time( Search( Pattern, Texts ) );
|
| (1.2.2) |
>
|
time( map2( Search, Pattern, Texts ) );
|
| (1.2.3) |
•
|
さらに、1 つのテキストについて複数のパターン検索を行うことが可能です。
|
>
|
SearchAll( [ "bac", "ab" ], "abcdababacef" );
|
| (1.2.4) |
>
|
P := [seq]( ThueMorse( i ), i = 5 .. 10 );
|
| (1.2.5) |
>
|
SearchAll( P, Random( 200, 'binary' ) );
|
![[6, 1], [6, 2], [6, 3], [6, 4], [14, 1], [14, 2], [14, 3], [14, 4], [14, 5], [25, 1], [54, 1], [54, 2], [54, 3], [54, 4], [54, 5], [177, 1], [177, 2], [187, 1], [187, 2], [187, 3], [187, 4]](/support/helpjp/helpview.aspx?si=2575/file01575/math154.png)
| (1.2.6) |
>
|
ReadWordList := fname -> remove( type, StringTools:-Split( readbytes( fname, 'TEXT', infinity ) ), "" ):
DICT := PatternDictionary:-Create( ReadWordList( "/usr/share/dict/words" ) ):
PatternDictionary:-Size( DICT );
|
| (1.2.7) |
>
|
PatternDictionary:-Get( DICT, 666 );
|
| (1.2.8) |
>
|
PatternDictionary:-Search( DICT, "childbirth" );
|
| (1.2.9) |
>
|
map2( PatternDictionary:-Get, DICT, map2( op, 2, [ % ] ) );
|
| (1.2.10) |
•
|
PatternDictionary サブパッケージは、また、パターンの辞書による文字列のファクタリングアルゴリズムを提供します。 文字列 s と 辞書 dict が与えられると、プロシージャ PatternDictionary[Factors] は、dictによる s の分解、つまり、文字列 s の連結をもつパターンの列を dict から計算します。
|
>
|
dict := PatternDictionary:-Create( 'builtin' ):
PatternDictionary:-Factors( "linearalgebra", dict );
|
| (1.2.11) |
•
|
このリリースには、glob スタイルのパターンマッチングを実行する新規ツール WildcardMatch があります。パターン言語 は、UNIX シェルで使用されているパターン言語に類似しており、一般に ファイルとディレクトリのリスティングに適用できます。
|
>
|
WildcardMatch( "a*b", "accccb" );
|
| (1.2.12) |
>
|
WildcardMatch( "a[c-z]b", "acccc" );
|
| (1.2.13) |
>
|
WildcardMatch( "a[c-z]??b", "acccc" );
|
| (1.2.14) |
>
|
WildcardMatch( "a[c-z]??b", "acccb" );
|
| (1.2.15) |
>
|
select( curry( WildcardMatch, "maple.???" ), listdir( `if`( nops( [ libname ] ) = 1, libname, libname[ 1 ] ) ) );
|
| (1.2.16) |
•
|
新規プロシージャ RegSplit を使用すると、正規表現にマッチする部分文字列の文字を分けることができます。
|
>
|
RegSplit( "(a|b)+", "xabyazbaabubav" );
|
| (1.2.17) |
>
|
RegSubs( "b" = "&&&", "abc" );
|
| (1.2.18) |
>
|
RegSubs( "[ \t]+" = " ", "Some text \twith\t\t too much white space. " );
|
| (1.2.19) |
>
|
Search( "maths", "mathematical" );
|
| (1.2.20) |
>
|
HammingSearch( "maths", "mathematical", 1 );
|
| (1.2.21) |
>
|
ApproximateSearch( "maths", "mathematical", 1 ); # reports END of match
|
| (1.2.22) |
>
|
IsSubSequence( "abc", "abracadabra" );
|
| (1.2.23) |
>
|
NGrams( "abracadabra", 2 ) ; # 2-grams or digrams
|
| (1.2.24) |
>
|
nops( % ) / nops( convert( %, 'set' ) );
|
| (1.2.25) |
>
|
NGrams( "abracadabra", 3 ) ; # 3-grams or trigrams
|
| (1.2.26) |
>
|
nops( % ) / nops( convert( %, 'set' ) );
|
| (1.2.27) |
|
|
英語テキストの操作
|
|
•
|
Porter's stemming algorithm が、新規プロシージャ Stem で実現されました。
|
| (1.3.1) |
>
|
Words( "Dimension implies direction, implies measurement, implies the more and the less." ); # - Edwin E. Abbot, "Flatland"
|
| (1.3.2) |
>
|
WordCount( "Dimension implies direction, implies measurement, implies the more and the less." );
|
| (1.3.3) |
| (1.3.4) |
| (1.3.5) |
|
SyllableLength の出力する値 は、あるワードについて辞書にある語彙の音節の長さにマッチしません。
|
>
|
SyllableLength( "antidisestablishmentarianism" );
|
| (1.3.6) |
|
|
組み合わせのユーティリティ
|
|
•
|
文字列に関する組み合わせ操作に対して、現在、多くのプロシージャが提供されています。
|
•
|
Permute プロシージャは、文字列に含まれる文字に 任意の順列を適用します。長さ n の文字列について次数 n の対称群の操作を定義します。
|
>
|
Permute( "abc", [ 1, 3, 2 ] );
|
| (1.4.1) |
•
|
2つの特別な場合が、プロシージャ Rotate と Exchange で提供されています。 前者は、(123...n) の形の順列を長さ n の文字列に適用し、 後者は、文字列に置換を適用します。
|
>
|
seq( Rotate( "abc", i ), i = -3 .. 3 );
|
| (1.4.2) |
>
|
Exchange( "abc", 1, 3 );
|
| (1.4.3) |
•
|
文字列の文字 (実際には、文字列のバイトコードポイント) は、プロシージャ Shift を使用して、同時に固定数シフトすることができます。これは、本質的に 一般の Caesar 暗号です。
|
| (1.4.4) |
| (1.4.5) |
•
|
プロシージャ Generate を使用して、定まった文字集合から指定した長さのすべての文字列を作成することができます。ユーザは、生成する文字列の長さと 文字列を生成する``アルファベット'' を指定します。文字列の数は、長さとアルファベットサイズとともに急速に大きくなるため、サイズが大きくない入力に対して使用する場合に限り、実用的です。
|
![["aaa", "aab", "aac", "aba", "abb", "abc", "aca", "acb", "acc", "baa", "bab", "bac", "bba", "bbb", "bbc", "bca", "bcb", "bcc", "caa", "cab", "cac", "cba", "cbb", "cbc", "cca", "ccb", "ccc"]](/support/helpjp/helpview.aspx?si=2575/file01575/math533.png)
| (1.4.6) |
•
|
プロシージャ Repeat は、繰り返し連結を実現します。
|
>
|
Repeat( "some text ", 4 );
|
| (1.4.7) |
•
|
Support ユーティリティは、文字列で起こる文字のセットを決定するのに使用されます。
|
| (1.4.8) |
•
|
プロシージャ numboccur に類似して、StringTools パッケージのプロシージャ NumbOccur は、文字列の文字の数をカウントします。
|
>
|
seq( NumbOccur( "foobar", ch ) , ch = Support( "foobar" ) );
|
| (1.4.9) |
|
|
空白スペースの取り扱い
|
|
•
|
プロシージャ Trim, TrimLeft, TrimRight は、文字列から初めと終わりの空白を除きます。新規プロシージャ Center, PadLeft, PadRight は、文字列に初め や 終わりに 空白を追加することにより、これらのテキストに逆の操作を行います。これらの各ルーチンの 2 番目の引数として幅 を指定する必要があります。
|
| (1.5.1) |
| (1.5.2) |
| (1.5.3) |
|
|
ワードの組み合わせ
|
|
•
|
多くの新規プロシージャは、(文字列として表される) ワードの組み合わせに関する調査をサポートします。
|
>
|
seq( ThueMorse( n ), n = 1 .. 10 );
|
| (1.6.1) |
>
|
seq( Fibonacci( n ), n = 1 .. 5 );
|
| (1.6.2) |
| (1.6.3) |
| (1.6.4) |
>
|
IsPrimitive( "ababab" );
|
| (1.6.5) |
>
|
PrimitiveRoot( "abc" );
|
| (1.6.6) |
>
|
PrimitiveRoot( "ababab" );
|
| (1.6.7) |
>
|
IsConjugate( "bca", "abc" );
|
| (1.6.8) |
>
|
IsConjugate( "bac", "abc" );
|
| (1.6.9) |
>
|
MinimumConjugate( "bca" );
|
| (1.6.10) |
>
|
MinimumConjugate( "bac" );
|
| (1.6.11) |
•
|
各文字列は、一意的な非増大の分解を部分文字列に持ちます。それぞれは、最小の conjugate です。 これらのファクタは、 文字列の Lyndon factors と呼ばれます。この分解は、プロシージャ StringTools[LyndonFactors] を使用して、計算することができます。
|
>
|
L := LyndonFactors( Fibonacci( 8 ) );
|
| (1.6.12) |
| (1.6.13) |
| (1.6.14) |
| (1.6.15) |
>
|
andmap( w -> evalb( w = MinimumConjugate( w ) ), L );
|
| (1.6.16) |
>
|
seq( evalb( L[ i ] <= L[ i - 1 ] ), i = 2 .. nops( L ) );
|
| (1.6.17) |
•
|
パッケージにより提供される 2 つめの分解は、ワードの単調なファクタへの分解です。
|
>
|
MonotonicFactors( Fibonacci( 8 ) );
|
| (1.6.18) |
>
|
andmap( IsMonotonic, % );
|
| (1.6.19) |
| (1.6.20) |
| (1.6.21) |
•
|
ワード (文字列) の周期性 は、パターンマッチング同様、ワードの組み合わせ論で重要な役割を果たします。正の整数 k は、i = 1 .. n-kに対して s[ i ] = s[ i + k ] の場合、文字列s の周期です。ここで、n は、s の長さです。プロシージャ StringTools[IsPeriod] を使用して k が s の周期であるかどうかテストすることができます。文字列 s の最小周期は、s の周期です。 文字列の周期 をプロシージャ StringTools[Period] を使用して計算することができます。
|
>
|
IsPeriod( "abcab", 2 );
|
| (1.6.22) |
>
|
IsPeriod( "abcab", 3 );
|
| (1.6.23) |
| (1.6.24) |
| (1.6.25) |
>
|
Border( Fibonacci( 8 ) );
|
| (1.6.26) |
>
|
seq( evalb( Border( Fibonacci( n + 2 ) ) = Fibonacci( n ) ), n = 1 .. 10 );
|
| (1.6.27) |
>
|
BorderArray( Fibonacci( 6 ) );
|
| (1.6.28) |
>
|
Overlap( "abc", "bcd" );
|
| (1.6.29) |
>
|
f8 := Fibonacci( 8 ):
Overlap( f8, f8 );
|
| (1.6.30) |
|
|
その他
|
|
>
|
Select( IsVowel, "facetious" );
|
| (1.7.1) |
>
|
CamelCase( "linearalgebraicgroups" );
|
| (1.7.2) |
>
|
Visible( Random( 10 ) );
|
| (1.7.3) |
>
|
Anagrams( "edit", [ "foo", "diet", "bar", "tide", "baz", "edit", "dite", "foobar" ] );
|
| (1.7.4) |
|
|
SumTools
SumTools パッケージには、現在、不定形和と定形和の閉じた式を見つける関数があります。 パッケージは、 3 つの関数と 3 つのサブパッケージから構成されます。
|
閉じた式を計算する関数
|
|
つぎは、定形和と不定形和の閉じた式を計算する関数です。
|
|
DefiniteSum パッケージ
|
|
DefiniteSum パッケージは、定形和の閉じた式を計算するツールを含みます。
•
|
Definite: 一般的なルーチンを使用して定形和の閉じた式を計算します。
|
•
|
Telescoping: classical telescoping methodを使用する定形和の閉じた式を計算します。
|
|
|
IndefiniteSum サブパッケージ
|
|
IndefiniteSum パッケージは、不定形和の閉じた式を計算するツールを含みます。
|
|
Hypergeometric サブパッケージ
|
|
Hypergeometric パッケージは、一般的に超幾何項を取り扱うツール、超幾何項の定形和と不定形和の閉じた式を見つけるためのツールを含みます。
•
|
超幾何タイプの 定形和 と 不定形和に対するアルゴリズム: ExtendedGosper, ExtendedZeilberger, Gosper, IsZApplicable, KoepfGosper, KoepfZeilberger, LowerBound, MinimalZpair, Zeilberger, ZeilbergerRecurrence, ZpairDirect
|
|
|
SumTools[Hypergeometric]の改良
|
|
>
|
with(SumTools:-Hypergeometric):
|
•
|
IsZApplicable: 超幾何項に対するZeilberger's algorithm の停止に対する必要条件と十分条件の実現
|
>
|
T1 := 1/(n*k+n+1)*binomial(n,k+1) +
(n*k-2*k-n+2)/(n^2*k+2*n*k^2-n*k+2*k+n-1)*binomial(n,k);
|
| (7.1) |
| (7.2) |
>
|
T2 := (-1)^k*1/(n*k+1)*binomial(n+1,k)*binomial(2*n-2*k-1,n-1);
|
| (7.3) |
| (7.4) |
•
|
LowerBound: 与えられた 2 変数超幾何項の telescopers の次数の下界を計算するアルゴリズムの実現
|
>
|
T3 := 1/(n*(k+1)+1)*binomial(2*n,k+1)-1/(n*k+1)*binomial(2*n,k)+
1/(2*k-1)/(n-3*k+1)*binomial(2*n,k);
|
| (7.5) |
| (7.6) |
>
|
T4 := (-1)^k*binomial(m,k)*binomial(2*k,k)*1/2^(2*k);
|
| (7.7) |
| (7.8) |
>
|
ExtendedZeilberger(V,n,k,En);
|
![[2*n+3+(-4*n-7)*En+(2*n+4)*En^2, k^2*(-1)^k*binomial(2*k, k)*(2*binomial(n+1, k)*(n+1)+binomial(n+1, k)-2*binomial(n+2, k)*(n+1)-2*binomial(n+2, k))/((-(1/2)*(2*n+3)*(n+1)/(n+2)+(1/2)*(2*n+3)*k/(n+2)-(1/2)*(2*n+3)/(n+2)+n+2)*(n+2)*2^(2*k))]](/support/helpjp/helpview.aspx?si=2575/file01575/math1281.png)
| (7.9) |
>
|
_EnvDoubleSum := true:
Sum(V,k=0..n) = DefiniteSum(V,n,k,0..n);
|
| (7.10) |
| (7.11) |
>
|
Sum(T5,n) = KoepfGosper(T5,n);
|
| (7.12) |
>
|
T6 := binomial(2/3*n,2*k);
|
| (7.13) |
>
|
Zpair := KoepfZeilberger(T6,n,k,En);
|
| (7.14) |
•
|
MinimalZpair: 超幾何項の minimal Z-pairs を計算するための様々なアルゴリズムの組み合わせ
|
>
|
T7 := 1/(3*n+20*k+2)^3;
|
| (7.15) |
>
|
MinimalZpair(T7,n,k,En);
|
| (7.16) |
>
|
T8 := 1/(n*(k+1)-1)/(n-2*k-4)/(2*n+k+4)!-1/(n*k-1)/(n-2*k-2)/(2*n+k+3)!+1/(n-2*k-2)/(2*n+k+3)!;
|

| (7.17) |
>
|
Zpair := MinimalZpair(T8,n,k,En):
Zpair[1];
|

| (7.18) |
|
関数 IsZApplicable を使用して以前に議論されたように、Zeilberger's algorithm を T2 に適用することはできません。
|
>
|
MinimalZpair(T2,n,k,En);
|
Error, (in SumTools:-Hypergeometric:-MinimalZpair)
Zeilberger's algorithm is not applicable
| |
|
|
VectorCalculus
|
|
VectorCalculus パッケージに、いくつかの改良点があります。
•
|
VectorCalculus の積分を計算する 演算はすべて、オプションの引数 inertをとります。このオプションがある場合、コマンドは、その計算の未評価の積分表現を出力します。
|
•
|
パッケージの最上位にある D コマンドは、Vector の取り扱いを拡張しました。
|
|
|
Worksheet
|
|
•
|
XML 形式のワークシートを新たにサポートするように、 Worksheet パッケージがアップデートされました。以前の形式と新形式の間でMaple ワークシートを変換するための様々なユーティリティが、パッケージに追加されました。
|
•
|
関数 Process と Validate は、Maple 9 では必要ありません。これらは、廃止されました。
|
|
|
XMLTools
|
|
•
|
XMLTools パッケージは、名前空間のサポート、XSLT 変換、XML 構文解析の検証など、 重要な新機能を伴いアップデートされました。
|
Warning, the name Compare has been rebound
| |
>
|
x := ParseString( "<m:math xmlns:m='http://www.w3.org/Math/'><m:apply><m:sin/><m:ci>θ</m:ci></m:apply></m:math>" ):
Print( x );
|
<m:math xmlns:m = 'http://www.w3.org/Math/'>
<m:apply>
<m:sin/>
<m:ci>θ</m:ci>
</m:apply>
</m:math>
| |
>
|
ElementName( FirstChild( x ) );
|
| (10.1) |
>
|
ElementType( FirstChild( x ) );
|
| (10.2) |
>
|
ss := "<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'><xsl:output method='xml' indent='yes'/><xsl:template match='a'><A><xsl:apply-templates select='b'/></A></xsl:template><xsl:template match='b'>B:<xsl:value-of select='@d'/></xsl:template></xsl:stylesheet>":
doc := "<a><b d='foo'/></a>":
Print( ss );
|
<stylesheet xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<output method='xml' indent='yes'/>
<template match='a'>
<A>
<apply-templates select='b'/>
</A>
</template>
<template match='b'>
B:
<value-of select='@d'/>
</template>
</stylesheet>
| |
>
|
res := ToString( Transform( ParseString( ss ), ParseString( doc ) ) ):
Print( res );
|
<?xml version='1.0' encoding='ISO-8859-1' ?>
| |
•
|
XML ドキュメントの内部表現が、このリリースで大幅に変更され、名前空間と DTD 内部サブセットをサポートすることに注意してください。
|
•
|
関数 JoinEntities, SeparateEntities, MakeElement, DocumentIterator が削除されました。
|
|
|
参照
|
|
->, andmap, binomial, cat, convert/set, curry, Maple 9の改良されたパッケージ: Part 1, evalb, Maple 9 の新機能インデックス, infolevel, length, libname, map2, Maple 9の新規パッケージ, nops, numboccur, op, PatternDictionary, proc, readbytes, select, seq, StringTools, Student, subs, time, Using Packages, Vector, VectorCalculus, with, Worksheet, XMLTools
|
|